Объяснение говорит, что запрос ужасен (он не использует один ключ), но я использую LIMIT 1. Это проблема? - PullRequest
1 голос
/ 05 мая 2010

Команда объяснения с запросом:

explain SELECT * FROM leituras 
WHERE categorias_id=75 AND 
textos_id=190304 AND 
cookie='3f203349ce5ad3c67770ebc882927646' AND 
endereco_ip='127.0.0.1' 
LIMIT 1

Результат:

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra       
1      SIMPLE          leituras  ALL      (null)            (null)  (null)      (null)  1022597  Using where 

Будет ли иметь какое-то значение добавление ключей на стол? Даже если запрос всегда будет возвращать только одну строку.

Ответы [ 3 ]

3 голосов
/ 05 мая 2010

В ответ на ваш вопрос, да. При необходимости вы должны добавить индексы ( спасибо @ Col.Shrapnel ) к столбцам, которые появляются в предложении WHERE - в данном случае categorias_id, textos_id, cookie и endereco_ip.

Если вы всегда выполняете запрос, используя одни и те же 3 столбца в предложении WHERE, может быть полезно добавить индекс, который состоит из 3 столбцов за один раз, вместо добавления отдельных индексов.

2 голосов
/ 05 мая 2010

Он все равно должен выполнять линейный поиск по таблице, пока не найдет эту строку. Таким образом, добавление индексов может заметно улучшить производительность.

1 голос
/ 05 мая 2010

Да, индексы еще важнее, когда вы хотите вернуть только одну строку.

Если вы возвращаете половину строк и ваша система баз данных должна сканировать всю таблицу, эффективность все равно будет на 50%.

Однако, если вы хотите вернуть только одну строку, и ваша система баз данных должна просканировать 1022597 строк, чтобы найти вашу строку, ваша эффективность будет минимальной.

LIMIT 1 действительно предлагает некоторую эффективность в том, что он останавливается, как только находит первую подходящую строку, но ему, очевидно, приходится сканировать огромное количество записей, чтобы найти эту первую строку.

Добавление индекса для каждого из столбцов в предложении WHERE позволяет вашей системе базы данных избегать сканирования строк, которые не соответствуют вашим критериям. При наличии адекватных индексов вы увидите, что столбец строк в объяснении приблизится к фактическому количеству возвращаемых строк.

Использование составного индекса, охватывающего все четыре столбца в вашем предложении WHERE, позволяет повысить производительность и уменьшить сканирование, поскольку индекс обеспечит полное покрытие. Составные индексы действительно используют много памяти и негативно влияют на производительность вставки, поэтому вам может потребоваться добавить составной индекс только в том случае, если большой процент ваших запросов неоднократно просматривает одни и те же столбцы, или если вы редко вставляете записи, или это это очень важно для вас, чтобы этот конкретный запрос был быстрым.

Еще один способ повысить производительность - возвращать только те столбцы, которые вам нужны, вместо использования SELECT *. Если у вас был составной индекс по этим четырем столбцам, и вы вернули только эти четыре столбца, вашей системе баз данных вообще не нужно будет обращаться к вашим записям. Система баз данных может получать все необходимое прямо из индексов.

...