Как снизить нагрузку скриптов при обращении к Mysql

12
L
На сайте с 22.08.2013
Offline
18
856

HI! Столкнулся с трудностью. Создаю запрос к БД Mysql с высоким количеством строк (~1млн), в которых храниться только имя исполнителя, название и композиции, дата добавления и ссылка на загрузку. В общем БД занимает всего 130 МБ.

Создавая запросы на подсчет кол-ва записей, скрипт виснет до 8 секунд. Пример запроса:

mysql_query("select count(*) from materials where status='1' and section='$sec' and category='$cat' limit 1");

БД - MyISAM, поле id,status,section,category - являются индексами. И не сказать, чтобы комп был совсем слабым - 4 ГБ ОЗУ, i5-3317U 1,7 ГГЦ.

Как уменьшить нагрузку? Хранить где то отдельно кол-во строк в таблице и периодически обновлять эту инфу?

LEOnidUKG
На сайте с 25.11.2006
Offline
1725
#1

А зачем этот запрос вообще?

Создайте отдельную таблицу и запищите туда подсчитанные данные. Нафиг mysql каждый раз их считать.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
IL
На сайте с 20.04.2007
Offline
435
#2
liggth:
Хранить где то отдельно кол-во строк в таблице и периодически обновлять эту инфу?

Вполне логично; по сути - "кэширование" результата запроса.

По поводу обновления - почитайте про триггеры, возможно, будет полезно.

liggth:
поле id,status,section,category - являются индексами.

И ещё про EXPLAIN и составные/композитные индексы (по нескольким полям)

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
siv1987
На сайте с 02.04.2009
Offline
427
#3

Если там есть индексы, в идеале один составной на эти поля, то не может этот запрос выполнятся 8 сек. Limit оттуда вообще можно убрать. Или юзайте коунтер в отдельное поле

SHOW CREATE TABLE и EXPLAIN SELECT покажите

T
На сайте с 24.07.2008
Offline
132
#4

Я бы реализовал вот так: http://habrahabr.ru/post/47031/

Но тут хозяин-барин как говорится ))

siv1987
На сайте с 02.04.2009
Offline
427
#5
Tempter:
Я бы реализовал вот так:

А чем вьюшка в данном случае поможет ТСу?

T
На сайте с 24.07.2008
Offline
132
#6
siv1987:
А чем вьюшка в данном случае поможет ТСу?

Основываясь на личном опыте обращение к вьюшке куда быстрее.

denis716
На сайте с 12.09.2007
Offline
115
#7

Покажите табличку (запрос SHOW CREATE TABLE `materials`)

Если поле статус - числовое, то не ставьте в запросе кавычки, будет сильно тормозить

select count(*) from materials where status=1 ...

LIMIT уберите, не надо..

TF-Studio
На сайте с 17.08.2010
Offline
334
#8

Закешировать проще, имхо.

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
E
На сайте с 03.12.2010
Offline
140
#9

Я бы посчитал один раз и хранил это число где-то отдельно (в таблице с параметрами и настройками или даже можно в файле) и при добавлении новой записи просто наращивал бы, а при удалении соответственно убирал.

Пысы. Выше писали про триггеры. Насколько я знаю, можно с помощью них сделать такое вот автоматическое обновление при изменении количества записей.

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#10

mysql_query("select count(*) from materials where status='1' and section='$sec' and category='$cat' limit 1");

1) LIMIT 1 - не в тему, так как count(*)

2) Если section и category текстовые - сделайте их INT(номера секций и категорий, а текстовые значения вынести в другие таблицы).

Другой вариант:

2 триггера записывающие кол-во записей куда-то: 1-ый при INSERT, а 2-ой при DELETE. То есть: вставили строку - триггер сделал +1 в таблицу где хранится кол-во строк таблицы materials, удалили строку - триггер сделал -1.

У меня аналогичный(тока сложней) запрос к таблице на 4кк записей с 2-умя джоинами, подзапросом, условиями и группировкой выполняется около секунды на более слабом компе.

Может это не запрос на 8сек тормозит, а сам скрипт?

Подпись))
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий