2016-02-11 3 views
0

Я столкнулся серьезные проблемы с производительностью после фиксации запроса:проблема производительности с отметкой времени в MySql

SELECT 
    ... 
    IF (Order_SG.Payment_Date = '0000-00-00', Order_SG.Creation_Date, Order_SG.Payment_Date) AS `DATE`, 
    ... 
FROM Order_SG 
    INNER JOIN Customer USING (Customer__) 
    INNER JOIN Order_SG_Detail USING (Order_SG__) 
    INNER JOIN Product_Ref USING (Product_Ref__) 
    INNER JOIN Reduction USING (Reduction__) 
WHERE ... 
    -- AND DATE BETWEEN '2016-02-10 00:00:00' AND '2016-02-11 00:00:00' 
    AND Order_SG.Stamp BETWEEN '2016-02-10 00:00:00' AND '2016-02-11 00:00:00' 
    LIMIT 2000 
    OFFSET 0; 

Перед Испытание проводили на DATE, и запрос будет работать в 0,174 сек.

enter image description here

После Испытание проводят на Stamp в 15.564 сек (РЗМ: это имеет смысл, что запрос будет возвращать больше строк).

Order_SG содержит около 31 миллиона строк.

Order_SG.Stamp определяется следующим образом:

enter image description here

Какие есть варианты? Как я могу решить эту проблему с производительностью?

UPDATE

Я установил 2016-02 23:59:59 опечатку и перепроверить мои номера. Я обновил свои данные выше.

SHOW INDEX FROM Order_SG не возвращает записи для Stamp, но есть BTREE индекс Creation_Date и Payment_Date, которые используются для создания DATE.

+4

Is 'AND '2016-02 23: 59: 59'' только опечатка? – jarlh

+0

Тип данных столбца? – jarlh

+1

php 'max_execution_time' не влияет на время выполнения запросов к базе данных, так как php учитывает только время процессора, используемое самим скриптом php. все остальные (время db, время передачи сети) в это не включены. Так что это не имеет значения. – poncha

ответ

3

Индекс stamp не указан. Таким образом, СУБД должна читать запись для записи из таблицы, чтобы проверить, подходит ли она или нет. С индексом на stamp он мог просто выбрать соответствующие записи по индексу.

Так что создайте индекс, например.

create index idx_order_sg_stamp on order_sg(stamp); 

и ваш запрос должен работать быстро.

+0

Нужно также видеть индексы в других таблицах. –

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