MySQL не будет использовать индекс для запроса? - PullRequest
0 голосов
/ 03 апреля 2010

У меня есть эта таблица:

CREATE TABLE `point` (                                                                                 
          `id` INT(11) NOT NULL AUTO_INCREMENT,                                                                
          `siteid` INT(11) NOT NULL,                                                                           
          `lft` INT(11) DEFAULT NULL,                                                                          
          `rgt` INT(11) DEFAULT NULL,                                                                          
          `level` SMALLINT(6) DEFAULT NULL,                                                                    
          PRIMARY KEY  (`id`),                                                                                 
          KEY `point_siteid_site_id` (`siteid`),                                                               
          CONSTRAINT `point_siteid_site_id` FOREIGN KEY (`siteid`) REFERENCES `site` (`id`) ON DELETE CASCADE  
        ) ENGINE=INNODB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci        

И этот запрос:

SELECT * FROM `point` WHERE siteid = 1;

Что приводит к этой информации EXPLAIN:

+----+-------------+-------+------+----------------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys        | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+----------------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | point | ALL  | point_siteid_site_id | NULL | NULL    | NULL |    6 | Using where |
+----+-------------+-------+------+----------------------+------+---------+------+------+-------------+

Вопрос в том, почему запрос не использует индекс point_siteid_site_id?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2010

Я не очень много использовал MySQL, но в PostgreSQL, если в таблице небольшое количество записей, он может решить не использовать индекс. Это не проблема, потому что он выбирает лучший план запроса для ситуации. Когда количество записей больше, он будет использовать индекс. Может быть, это тот же самый случай здесь с MySQL.

Редактировать: Вы уверены, что внешний ключ проиндексирован?

0 голосов
/ 03 апреля 2010

Вероятно, это связано с тем, что у вас недостаточно выборочных данных, или количество значений в сайте не очень велико. Это наиболее распространенные причины, по которым оптимизатор будет быстрее читать все значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...