LINUX.ORG.RU

Тормоза с БД

 ,


0

1

Подскажите, пожалуйста, есть средних размеров БД на mysql и средней сложности запрос к ней.

Генерация web-страницы занимает слишком долгое время (40-60 с), при том что оно тратится именно на обращение к БД с этим запросом:

$ts=microtime(true);
$result=mysql_query($sql);
printf('<script>alert("%.6f s")</script>',microtime(true)-$ts);

Фишка в том что этот же запрос в консольном mysql клиенте и в phpmyadmin отработывает меньше чем за секунду, с теми же результатами.

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

Тормоза возникают именно при таком запросе и только на сайте. В чем может быть проблема?

SELECT DISTINCT schools.name_sch, schools.num_sch, parents.tel_sms, class.class, parents.fio, parents.fio1, parents.fio2, account.login, account.status, parents.apay, parents.money, account.printed
FROM parents, class, account, schools, cards
WHERE 1 
AND account.num_sch = schools.num_sch
AND account.parents = parents.tel_sms
AND account.class_id = class.id
AND cast( class.class AS signed ) <12
AND parents.tel_sms LIKE '%905123%'
ORDER BY fio
★★★

SELECT DISTINCT

DISTINCT

На двенвдцати(!) полях

И да, use explain!

linuxnewb
()

Фишка в том что этот же запрос в консольном mysql клиенте и в phpmyadmin отработывает меньше чем за секунду

_После_ запроса на сайте? Может, просто кешируется?

KRoN73 ★★★★★
()

Фишка в том что этот же запрос в консольном mysql клиенте и в phpmyadmin отработывает меньше чем за секунду, с теми же результатами. При обращении к той же странице выполняется еще ряд мелких sql запросов, но они отрабатывают очень быстро.

А ты попробуй первым запросом на странице выполнить вообще пустой запрос, так же померь время, и сравни. Сильно подозреваю, что тормозит не запрос, а соединение/авторизация.

ABW ★★★★★
()
Ответ на: комментарий от ABW

Сильно подозреваю, что тормозит не запрос, а соединение/авторизация.

Тогда бы не mysql_query() тормозил, а mysql_connect()

KRoN73 ★★★★★
()

я думаю что дело банально в том что phpmyadmin добавляет в запросы LIMIT чтобы выводить постранично. Если записей много (а судя по 40-60 секундам записей довольно много для такого запроса), то запрос будет легче на порядок или даже на порядки. Вот поэтому phpmyadmin и выполяет его быстро. Кстати, попробуй в Phpmyadmin перейти на последнюю страничку - получишь те же тормоза...

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

Неа, результатов немного, 1-10 строк, при том в консольном mysql тоже нет LIMIT

disarmer ★★★
() автор топика
Ответ на: комментарий от KRoN73

Опа, похоже действительно кешируется, прошло время и запрос в консоли так же тормозит как и на сайте.

Спасибо!

disarmer ★★★
() автор топика
Ответ на: комментарий от linuxnewb

LIKE не виноват:

SELECT * FROM parents WHERE parents.tel_sms LIKE '%905%';
234 rows in set (0.00 sec)

И если убрать DISTINCT то же самое

disarmer ★★★
() автор топика
Ответ на: комментарий от KRoN73

Да я и подумал, что, может быть, он явно не вызывается, а дергается неявно при первом запросе.

ABW ★★★★★
()
Ответ на: комментарий от disarmer

Прошу прощения, без DISTINCT возвращает огромное количество строк, но при DISTINCT только по одному первому полю все нормально, но время не меняется

disarmer ★★★
() автор топика
Ответ на: комментарий от linuxnewb

Спасибо, проблема все таки была действительно в LIKE. С помощью JOINов создавалась огромная таблица, и по ней уже LIKE и тормозил =)

disarmer ★★★
() автор топика
Ответ на: комментарий от disarmer

LIKE и тормозил

... и хорошо, что я до конца дочитал.

JOINы — это нормально. Когда выражение в LIKE'е начинается с %, индексы не используются.

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

(можно при записи сразу приводить к единому формату, +7 либо 8)

linuxnewb
()
Ответ на: комментарий от linuxnewb

(можно при записи сразу приводить к единому формату, +7 либо 8)

ненене, мне нужен поиск по части номера телефона, потому и LIKE

На самом деле проблема была в лишней таблице cards в FROM, по которой не было условия JOIN. В результате получалась огромная таблица, и уже по ней проползал LIKE

disarmer ★★★
() автор топика
Ответ на: комментарий от resurtm

ну так вот mysqli же есть, если нужнен только MySQL. Несёт в себе ООП-онутый и процедурный подход.

alexmaru
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.