Mysql Query не использует первичный ключ - PullRequest
1 голос
/ 28 декабря 2011
  • Querycache отключен!
  • Индексы загружены на 100% в ОЗУ
  • индекс только ID

1benchmark:

"SELECT title FROM posts LIMIT ?, 15";
? = rand(1,183655);

EXPLAIN 
id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  posts   ALL     NULL    NULL    NULL    NULL    183637  

после выполнения 100 циклов это заняло более 100 секунд.

2Benchmark:

"SELECT title FROM posts WHERE id = 78845 OR id = 158738 OR id = 57065 OR id = 146797 OR id = 78918 OR id = 65227 OR id = 117987 OR id = 92541 OR id = 39782 OR id = 1958 OR id = 180384 OR id = 170758 OR id = 102227 OR id = 180223 OR id = 46391";

    in each loop every id is generated via rand(1,183655);

после выполнения 100 циклов для завершения потребовалось 6 секунд, и он использует первичный ключ.

Проблема, я думаю, в LIMIT MySQL не использует первичный ключ для id .

После повторного тестирования с Limit:

SECONDS:        LOOPS:  SQL:
41.560034990311 =    30 =   "SELECT title FROM posts LIMIT ?, 15";
36.302664995193 =    30 =   "SELECT title FROM posts ORDER BY id LIMIT ?, 15";
70.335160970688 =    30 =   "SELECT title FROM posts ORDER BY id ASC LIMIT ?, 15";
48.453547000885 =    30 =   "SELECT id, title FROM posts LIMIT ?, 15"

Как-то, но я не 100% уверен . Я обновил свой VMware PHP5.1.6 до PHP5.3 с тех пор, как заметил, что эти запросы LIMIT занимают больше времени.

1 Ответ

2 голосов
/ 28 декабря 2011

Вы можете запустить это вместо:

SELECT title 
FROM posts 
WHERE id >= ?
LIMIT 15

Это не эквивалентно LIMIT ?, 15, но будет использовать индекс.

Вы также можете проверить эту статью .

...