2013-10-24 2 views
0

У меня возникли проблемы с длинными запросами на самые простые запросы. Это мой первый опыт работы с большим столом (12,5 млн. Строк), и я просто пытаюсь выяснить, что может быть узким местом или что я могу сделать для повышения производительности. Все данные находятся в 1 таблице.Проблемы с производительностью базы данных

Серверные функции:

Windows Server 2008 R2 Standard Intel Xeon X3430 @ 2,40 ГГц 4 Гб RAM 1TB 7200RPM HDD

Таблица информационных

ID междунар (10) UN PK AI
Магазин Int (2) UN
Дата DateTime
Регистрация Int (2) UN
Кассир Int (3) ООН
Департамент Int (4) UN
Итого десятичное (7 , 2)
Клиенты int (5) UN
Товары Int (5) ООН
Время INT (5) ООН

Пример запросов и времена

SELECT Store, sum(Total) 
FROM sales 
GROUP BY Store 

19.56sec

SELECT Date, Register, Customers, Items, Total 
FROM sales 
WHERE Date(Date) = Date('2013-10-22') 
AND Store = 1 

9.59sec

Я могу, конечно, предоставить больше информации, но есть ли какие-либо очевидные причины, почему они работают так медленно?

+2

Каковы ваши показатели? Используйте 'explain' и сообщите нам результат ваших предложений select. – kmas

+0

Это может быть медленное использование индексов, тогда также может быть проблемой файл конфигурации my.ini. – kmas

+0

Вместо информации таблицы, которую вы добавили, добавьте вывод 'SHOW CREATE TABLE sales;' output. Для других гораздо более полезно узнать подробности структуры и индексов таблицы. –

ответ

0

Да, есть 2 вопиющих вопроса. В первом запросе у вас нет критериев - поэтому вы просите прочитать всю таблицу продаж, сгруппированы и суммированы. Группировка также создаст временную таблицу. Следовательно, вы сделаете сканирование таблицы, и это будет ограничено тем, что аппаратное обеспечение может обеспечить с точки зрения производительности io, что, вероятно, является вашим узким местом.

Во втором запросе вы выполняете функцию в столбце Date Date (Date), что означает, что даже если у вас есть индекс в Date, он не сможет использовать этот индекс, поэтому еще раз вы собираетесь таблица сканирует таблицу.

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

+0

Спасибо за совет! Мне нужно будет изучить, есть ли альтернатива Date (Дата), и я обязательно проверю объяснение, расширенное. –

+0

Вставьте результаты объяснения в ваш вопрос: это поможет @ypercube и мне лучше понять ваши проблемы. Вы также можете настроить параметры на свой экземпляр mysql, чтобы они могли быть полезны. Являются ли ваши таблицы innodb engine? Я бы очень рекомендовал это. – gview

-1

Две вещи, которые вы можете попробовать для второго запроса: (1) Создайте индекс для столбца datetime. (2) Использование целым числом вместо DateTime, 2013-10-22 => 20131022

1

Запрос 1:

SELECT Store, sum(Total) 
FROM sales 
GROUP BY Store ; 

Добавить индекс по (Store, Total):

ALTER TABLE sales 
    ADD INDEX store_total_IX    -- pick a name for the index 
    (store, total) ; 

Запрос 2 :

SELECT Date, Register, Customers, Items, Total 
FROM sales 
WHERE Date(Date) = Date('2013-10-22') 
AND Store = 1 ; 

Добавить индекс по (Store, Date):

ALTER TABLE sales 
    ADD INDEX store_date_IX    -- pick a name for the index 
    (store, date) ; 

и переписать запрос - поэтому индекс может быть использован - как:

SELECT Date, Register, Customers, Items, Total 
FROM sales 
WHERE Date >= '2013-10-22' 
    AND Date < '2013-10-22' + INTERVAL 1 DAY 
    AND Store = 1 ; 
+0

Спасибо за ответ! После добавления индекса к первому запросу время сократилось примерно до 9 секунд. Просто избавляясь от даты (даты) во втором запросе и заменяя ее своим предложением, вырезаем запрос до 1,6 секунды. –

+0

Это звучит очень неэффективно. Я предлагаю вам проверить конфигурацию mysql. Настройки. –

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