mysql не использует индексы

218
22 сентября 2018, 06:10

есть такой запрос:

EXPLAIN 
SELECT t.number, t.dept_id, d.ls, ue.address, t.isshow, d.`cust-name`, t.status_id, d.subject, t.ticket_id, t.created as cr_tic 
FROM `ost3_ticket` t 
LEFT JOIN `ost3_ticket__cdata` d on (t.`ticket_id` = d.`ticket_id`) 
LEFT JOIN `ost3_user_email` ue on (t.`user_id` = ue.`user_id`) 
WHERE ue.`user_id` = t.`user_id` 
AND (d.`ls` = "123456789" OR ue.`address` = "mail@gmail.com") 
ORDER BY cr_tic desc

он показывает такой результат:

таблица тикетов и мейлов не связываются по индексу.

в таблице ost3_ticket поле user_id указан в качестве индекса, int(11) UNSIGNED, BTREE.

в таблице ost3_user_email поле user_id указано точно так же: индекс, int(11) UNSIGNED, BTREE.

при поисках решения узнал что индексы должны быть одинакового типа, но в моём случае не хватает чего то ещё.

из за того что он не связывает таблицы по индексу запрос выполняется ~0.55с, как настроить индексы что бы оптимизировать этот запрос?

Answer 1

как отметил Akina, всё портит OR в блоке WHERE, поэтому я решил разбить запрос. конкретно в моей задаче с UNION возникли проблемы, поэтому я сделал 3 разных запроса - первые 2 выбирают ticket_id в соответствии с параметрами (т.е. из 2х условий в WHERE я сделал 2 запроса), а третий - запрос из вопроса в условии которого ticket_id IN(результаты 2х запросов). код на php:

if($em != ""){
    $oth_t = db_query("SELECT ticket_id FROM `ost3_ticket` ts INNER JOIN `ost3_user_email` ue on (ts.`user_id` = ue.`user_id`) WHERE ue.`address` = \"".$em."\"");
    while($item = db_fetch_array($oth_t)){$tid_emails[] = $item;}
}
if($sls != ""){
    $oth_t = db_query("SELECT ticket_id FROM `ost3_ticket__cdata` WHERE `ls` = \"".$sls."\"");
    while($item = db_fetch_array($oth_t)){$tid_ls[] = $item;}
}
#если хоть один операнд null - итоговый массив будет null, поэтому приведение типов
$tid_all = array_merge((array)$tid_emails, (array)$tid_ls); 
foreach($tid_all as $item){$sql_in .= $item["ticket_id"].",";}
$sql = '
    SELECT t.number, t.dept_id, d.ls, ue.address, t.isshow, d.`cust-name`, t.status_id, d.subject, t.ticket_id, t.created as cr_tic 
    FROM `ost3_ticket` t 
    LEFT JOIN `ost3_ticket__cdata` d on (t.`ticket_id` = d.`ticket_id`) 
    LEFT JOIN `ost3_user_email` ue on (t.`user_id` = ue.`user_id`) 
    WHERE t.ticket_id IN ( '.substr($sql_in, 0, -1).' )
    ORDER BY cr_tic desc
    ';
READ ALSO
mysqli_real_connect(): (HY000/1698): Access denied for user 'root'@'localhost'

mysqli_real_connect(): (HY000/1698): Access denied for user 'root'@'localhost'

Установил mariadb-server-101 на Debian9

240
Переменная в названии столбца в условии Select'a

Переменная в названии столбца в условии Select'a

Столбцы таблицы названы номерамиПеременной присваивается некое число

135
Access denied for user 'root'@'localhost'

Access denied for user 'root'@'localhost'

Установил mariadb-server и mariadb-clientПосле установил phpmyadmin, всё устанавливал через sudo apt-get install

149
Изменение формата даты и времени в таблице mysql

Изменение формата даты и времени в таблице mysql

В столбце "title" таблицы wp_foro_posts дата и время отображаются так: 200908

207