Таблицы:Почему мой индекс не используется в выборе тузды
CREATE TABLE `titles` (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL,
PRIMARY KEY (`emp_no`,`title`,`from_date`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Этого запрос:
EXPLAIN SELECT * FROM employees.titles WHERE emp_no < '10010' and title='Senior Engineer';
+----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | titles | range | PRIMARY | PRIMARY | 4 | NULL | 16 | Using where |
+----+-------------+--------+-------+---------------+---------+---------+------+------+-------------+
Мой вопрос, почему только первый столбец может использовать индекс? Я знаю, что многие статьи/документы дают такой вывод, но я хотел бы узнать подробное объяснение.
Моего понимания, MySQL может сканировать индекс ВТКЕЯ и найти коллекцию ключей, которые соответствуют emp_no < '10010'
, а затем фильтровать их на title='Senior Engineer'
, почему он сказал, что from_data
столбец не может использовать индекс? (Кстати, я думаю, что знаю, как работает B + Tree).
Спасибо.
Ниже выход объяснить формат = JSON:
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "1.41"
},
"table": {
"table_name": "titles",
"access_type": "range",
"possible_keys": [
"PRIMARY"
],
"key": "PRIMARY",
"used_key_parts": [
"emp_no"
],
"key_length": "4",
"rows_examined_per_scan": 1,
"rows_produced_per_join": 1,
"filtered": "100.00",
"cost_info": {
"read_cost": "1.21",
"eval_cost": "0.20",
"prefix_cost": "1.41",
"data_read_per_join": "168"
},
"used_columns": [
"emp_no",
"title",
"from_date",
"to_date"
],
"attached_condition": "((`employees`.`titles`.`emp_no` < '10010') and (`employees`.`titles`.`title` = 'Senior Engineer'))"
}
}
}
Спасибо за ответ и ссылку, MySQL версия 5.7 .10 - последний, добавленный json-выход, но я думаю, что key_length показывает всю информацию. Вы предлагаете хорошо, но я не настраиваю запрос здесь, это надуманный пример, и я просто хочу знать, почему. – July
Но вы упомянули «последовательный» в своем последнем предложении, возможно, именно по этой причине он не «перешагнул». – July
См. «Объяснение EXPLAIN». –