2016-12-13 2 views
0

Я попытался сделать индексы на своем столе. Но сначала mysql использует его, а не использует индекс.Mysql не использует индекс

Это мои табличные индексы. enter image description here

Мой запрос.

EXPLAIN SELECT 
COUNT(DISTINCT K.bayiid) AS toplam, 
SUM(K.tutar) AS yatirilan, 
SUM(IF(K.durum='2', K.tutar*K.toplam,0)) AS kazanc, 
SUM(IF(K.durum='-1', K.tutar, 0)) AS kayip, 
SUM(IF(K.durum='1', K.tutar,0)) AS devam, 
SUM(IF(K.durum='0', K.tutar,0)) AS iptal, 
SUM(1) AS oynanan, 
SUM(IF(K.durum='2', 1,0)) AS kazanan, 
SUM(IF(K.durum='-1', 1,0)) AS kaybeden, 
SUM(IF(K.durum='1', 1,0)) AS devameden, 
SUM(IF(K.durum='0', 1,0)) AS iptalolan, 
U.* 
FROM kuponlar AS K 
INNER JOIN users AS U ON U.id = K.bayiid AND U.durum != '4' AND U.id = '26689' 
WHERE K.durum < 3 AND K.tarih >= '2016-12-01 00:00:00' AND K.tarih <= '2016-12-31 23:59:59' 

Запрос объяснений enter image description here

Но я не хочу использовать USE INDEX или FORCE INDEX. Вы знаете, почему mysql работает неустойчиво?

ответ

2
ON U.id = K.bayiid 
AND U.durum != '4' 
AND U.id = '26689' 

Для наглядности передвиньте последние 2 части на WHERE; оставьте только условие (условия), которое определяет JOIN.

WHERE K.durum < 3 
    AND K.tarih >= '2016-12-01 00:00:00' 
    AND K.tarih <= '2016-12-31 23:59:59' 

Предложение: Для диапазонов дат, сделать что-то вроде этого:

AND K.tarih >= '2016-12-01' 
    AND K.tarih < '2016-12-01' + INTERVAL 1 MONTH 

Для K, есть

INDEX(bayiid, darum) 
INDEX(bayiid, tarih) 

(Не зная распределения данных, я не могу предсказать, что Оптимизатор выберет.)

Если вы хотите обсудить этот кусок ее, пожалуйста, предоставьте SHOW CREATE TABLE для каждой таблицы. Если случаются несоответствия типов данных, это может вызвать множество проблем, и мы не можем видеть его без SHOW.

Indexing cookbook

Смежные вопросы