2012-03-24 2 views
1

У меня есть запросMysql индексирование и присоединяется к

SELECT `a`.restid, `b`.`name` AS execname, `c`.`dept_name` 
FROM `tk_ticket` AS a 
INNER JOIN `tk_acp_users` AS b ON `a`.`exec_id` = `b`.`id` 
INNER JOIN `tk_ticket_dept` AS c ON `a`.`dept_id` = `c`.`dept_id` 
WHERE `a`.`dept_id` IN(9,11) 
AND `a`.`status` = 0 
ORDER BY `a`.`date` DESC, `a`.`dept_id` 

Explain выход

1 SIMPLE a ALL exec_id_2 5391 Using where; Using filesort 
1 SIMPLE b eq_ref PRIMARY PRIMARY 2 tk_new_db.a.exec_id 1 
1 SIMPLE c eq_ref PRIMARY PRIMARY 1 tk_new_db.a.dept_id 1 Using where 

Когда я запускаю объяснить я получаю полное сканирование таблицы для таблицы а, как я предотвратить это я добавлен ключ (exec_id, dept_id, status), но этот индекс не рассматривается.

+1

Что о первичных ключах? –

+0

Можете ли вы опубликовать вывод плана объяснения? –

+0

Я думаю, что «ORDER BY' a'.'date' »вызывает полное сканирование таблицы. Нет времени проверять его, так что это просто слепое предположение, извините. – Timur

ответ

1

Я не думаю, что MySQL может использовать индекс на (exec_id, dept_id, status) здесь, потому что в вашем предложении WHERE нет exec_id. Попробуйте добавить индекс (dept_id, status) вместо этого и, возможно, поместить отдельный элемент (exec_id) для JOIN. См. http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

0

Поскольку ваше предложение WHERE использует dept_id и статус, но не exec_id, созданный вами индекс не будет использоваться.

Это как, если таблица имеет индекс с несколькими столбцами, любой самый левый префикс индекса может использоваться оптимизатором для поиска строк. Например, если у вас есть индекс с тремя столбцами (col1, col2, col3), у вас есть индексированные возможности поиска в (col1), (col1, col2) и (col1, col2, col3).

MySQL не может использовать индекс, если столбцы не образуют крайний слева префикс индекса

Вы можете прочитать больше, здесь: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html