Проблема с запросом MySQL занимает много времени - PullRequest
0 голосов
/ 06 марта 2012

У меня следующий запрос к базе данных mysql:

select value from fact_data 
join entities on fact_data.entity_id=entities.id
where entities.ticker='{value}'
limit 1

fact_data - это большая таблица с> 23 миллионами записей. Если {значение} существует в entity.ticker, запрос возвращается менее чем за секунду. Но если {значение} не существует, запрос занимает более 2 минут, чтобы вернуться. Это как если бы сканирование таблицы выполнялось на fact_table. Почему бы mysql сначала не выполнить проверку, чтобы увидеть, существует ли entity.ticker с {value}, а затем, если его нет, нет необходимости выполнять дополнительную обработку.

Кстати, вот вывод EXPLAIN по вышеуказанному запросу:

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,SIMPLE,fact_data,ALL,NULL,NULL,NULL,NULL,23414811,
1,SIMPLE,entities,eq_ref,PRIMARY,PRIMARY,4,findata.fact_data.entity_id,1,"Using where"

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

Если это общий запрос, то вы должны добавить индекс в столбец entity.ticker соответствующего типа, для целых чисел это тривиально, для char вы должны указать соответствующую длину и добавить полнотекстовый индекс.

Что касается того, почему mysql не проверяет, есть ли там значение или нет, перед сравнением, он все равно должен извлечь каждую строку и затем прочитать значение этого столбца, если этот столбец не является частью первичного ключа или индекса.

0 голосов
/ 06 марта 2012

Добавить индекс в поле entity.ticker. Индексы значительно ускоряют выполнение запросов, если они являются частью предложения where.

...