Медленный SQL-запрос - более 15000 мс - простой запрос SELECT, процессор более 100%

0

У меня есть страница с простыми sql-запросами:

Посетитель находится на странице 940, поэтому мне нужно найти продукты, чтобы показать на этой странице:

SELECT * 
FROM items 
WHERE stock = 1 AND hide = 0 
ORDER BY id DESC 
LIMIT 36 
OFFSET 33804

этот запрос занимает 15463.242 ms.

Также мне нужно показать фильтр с производителями, размеры и информацию о магазине для всех продуктов на складе:

SELECT MANUFACTURER, sizes, store 
FROM items 
WHERE stock = 1 AND hide = 0

это занимает 17996.684 ms.

Я не понимаю, почему так много времени.

Структура таблицы:

id  int(11) Auto Increment   
ID_PRODUCT  varchar(200)     
PRODUCT varchar(200)     
DESCRIPTION mediumtext   
URL varchar(300)     
PRICE_VAT   int(7)   
MANUFACTURER    varchar(150)     
CATEGORY    varchar(150)     
IMGSURL varchar(3000)    
catids  varchar(30)  
sizes   varchar(30)  
store   varchar(30)  
stock   int(1)   
hide    int(1)   

Информация о таблице:

Data size: 327 974 912
Index size: 12 075 008
Free space: 4 194 304
Rows: 310 823

Он использует InnoDB и mysql 5.5.5-10.0.29-MariaDB-0 + deb8u1.

Не могли бы вы помочь мне, что не так с этими запросами? Посетители не могут ждать более 30 секунд. Кроме того, процессор выполняет более 100% при выполнении запроса hte.

  • 2
    Каков индекс ваших таблиц? 300к строк кажутся не слишком много
  • 1
    У вас есть индексы?
Показать ещё 6 комментариев
Теги:
mariadb

1 ответ

0

Tough.

Как пользователь добрался до страницы 940? Конечно, не нажав [Далее] 939 раз? Или, может быть, это робот Google?

Какой тип данных стоит в такой степени? Например, я бы нашел другой способ структурирования данных, которые не включают более нескольких сотен элементов на уровень иерархического дерева. Если на каждом уровне было ровно 36 элементов, дерево было бы всего 4 уровня для строк 310K. 3 клика лучше, чем 939. И базовый запрос будет быстрее. Даже простая двухуровневая иерархия магазина + продукта очень помогла бы.

ХОРОШО. Я дам вам несколько подсказок о том, что можно сделать.

Первый. Предоставьте SHOW CREATE TABLE; вы оставили кучу полезной информации.

  • Является ли ID_PRODUCT уникальным? Если это так, возможно, это должен быть PRIMARY KEY? Комментарий подразумевает, что PRIMARY KEY(id_product, store) (в любом порядке) будет полезен.
  • INDEX(stock, hide) (в любом порядке) может помочь в производительности.
  • INDEX(stock, hide, id), а также изменение разбивки на страницы, чтобы "запомнить, где вы остановились", сделало бы разбивку на страницы намного быстрее. Дальнейшее обсуждение здесь.
  • Какова ценность 'innodb_buffer_pool_size?
  • 100% процессор подразумевает, что вы не привязаны к I/O, и нам нужно сосредоточиться на индексах и формулировке запросов. (Аппаратное обновление не полезно - все процессоры сегодня имеют одинаковую скорость).
  • Вы говорите ORDER BY id DESC; это необходимо? Или какой-нибудь другой порядок будет в порядке? Обратите внимание, что страница 940, вероятно, содержит смесь продуктов из смеси магазинов.
  • Знаете ли вы, что "разбиение на страницы с помощью смещения и ограничения" подвержено пропуску и/или дублированию элементов на выходе?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню