есть такой запрос:
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с, как настроить индексы что бы оптимизировать этот запрос?
как отметил 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
';
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Установил mariadb-server-101 на Debian9
Столбцы таблицы названы номерамиПеременной присваивается некое число
Установил mariadb-server и mariadb-clientПосле установил phpmyadmin, всё устанавливал через sudo apt-get install
В столбце "title" таблицы wp_foro_posts дата и время отображаются так: 200908