У меня есть страница с простыми 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.
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)
, а также изменение разбивки на страницы, чтобы "запомнить, где вы остановились", сделало бы разбивку на страницы намного быстрее. Дальнейшее обсуждение здесь.ORDER BY id DESC
; это необходимо? Или какой-нибудь другой порядок будет в порядке? Обратите внимание, что страница 940, вероятно, содержит смесь продуктов из смеси магазинов.