Еще вопрос по скорости работы запроса к БД

Asar
На сайте с 23.08.2004
Offline
334
775

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

Выглядит окончательный вариант примерно так:

SELECT Field1, Field2, Field3, Field4, Field5, Field6, Field7, Field8, Field9 FROM Table ORDER BY Field4, Field5 LIMIT 50.

Заметно же влияет на выдачу только уменьшение строк в таблице (в полном варианте их там порядка 10.000).

Да, в таблице довольно много полей (40). Но неужели только из-за этого запрос, в котором вообще нет условий может тормозить так, что страница выползает только секунд через 10 (при уменьшении строк в таблице до 1000 штук страница выползает в течение секунды—двух)? И при этом не тормозить, если добавлять условия или даже извращаться, заделывая новые запросы при прогоне цикла по mysql_fetch_assoc.

З.Ы. Удаление ORDER тоже ни на что особо не влияет.

Ragnarok
На сайте с 25.06.2010
Offline
239
#1

SELECT (*) FROM Table ORDER BY Field4, Field5 LIMIT 50 ?

//TODO: перестать откладывать на потом
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#2

Где он тормозит? На сервере или где? 10К записей это вообще капля в море для БД.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
A
На сайте с 29.12.2007
Offline
68
#3

1. Ключи на Field4, Field5 стоят?

2. Какие вообще ключи в таблице?

3. Тормозит - что значит? Какое именно время выполняется? Было бы хорошо, если сделали демо-базу и выложили в виде sql-файла.

4. Explain что показывает?

Asar
На сайте с 23.08.2004
Offline
334
#4
Ragnarok:
SELECT (*) FROM Table ORDER BY Field4, Field5 LIMIT 50 ?

В смысле? Так быстрее должно быть? Дык, там ж 40 полей. Ну, и пробовал так тоже. Уж точно не быстрее...

Asar добавил 14.08.2011 в 23:18

LEOnidUKG:
Где он тормозит? На сервере или где? 10К записей это вообще капля в море для БД.

Вот и я удивляюсь. На сервере. Не при выдаче же в браузер...

Ragnarok
На сайте с 25.06.2010
Offline
239
#5
Asar:
В смысле? Так быстрее должно быть? Дык, там ж 40 полей. Ну, и пробовал так тоже. Уж точно не быстрее...

у меня было что (*) быстрее работал, чем запрос с перечислением полей, так что мало ли

Asar:

Вот и я удивляюсь. На сервере. Не при выдаче же в браузер...

а это мысль.

скачай на локалхост базу и проверь, вдруг чё

A
На сайте с 29.12.2007
Offline
68
#6
Ragnarok:
у меня было что (*) быстрее работал, чем запрос с перечислением полей, так что мало ли

Да ладно? По логике такое возможно, когда в базе только цифры, без строковых параметров. Но на практике ни разу с таким не сталкивался. Скорее всего вы путаете с COUNT(*).

Asar
На сайте с 23.08.2004
Offline
334
#7
aktuba:
1. Ключи на Field4, Field5 стоят?

Нет, только на Field4. Но, как я и написал выше, оно все так же тормозит, если вообще ORDER убрать!

aktuba:
2. Какие вообще ключи в таблице?

Ключи в таблице для всех полей, по которым возможны условия (WHERE). Всего 8 штук. Но оно тормозит и вообще без условий (для теста делал).

aktuba:

3. Тормозит - что значит? Какое именно время выполняется? Было бы хорошо, если сделали демо-базу и выложили в виде sql-файла.

К сожалению, т.к. я чайник, то тормозит оно именно на глаз в браузере (вплоть до 504 иногда). При этом, кстати, если через phpmyadmin запрос сделать — все моментально выполняется (в т.ч. и с WHERE). И вот это меня вообще вводит в транс. Куды бечь?

aktuba:

4. Explain что показывает?

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE TableName ALL NULL NULL NULL NULL 10076 Using filesort

З.Ы. Еще одна странность. Вчера ночью вдруг все забегало. И на этой странице, и на паре других, где были проблемы, но поменьше. Потом опять все как обычно. Спрашиваю хостера — чего это у вас там было. Они грят, ничего не было, только резервное копирование в это время шло.

Asar добавил 14.08.2011 в 23:39

Уфф. Кажись, нашел. Дело оказалось в соседнем запросе, который еще более тупой (чем я), и для которого было 100 штук запросов в цикле, плюс каждый из этой сотни содержал еще по циклу запросов на 10—50...

Спасибо всем за участие.

Asar добавил 14.08.2011 в 23:40

З.Ы. А чтобы дурацкие вопросы поменьше задавать, скажите — как можно замерить время выполнения запроса к БД? Ни разу не делал...

Алексей Барыкин
На сайте с 04.02.2008
Offline
272
#8
Asar:

З.Ы. А чтобы дурацкие вопросы поменьше задавать, скажите — как можно замерить время выполнения запроса к БД? Ни разу не делал...

start = microtime(1);

<запрос к БД>
$finish = microtime(1);
$time = $finish - $start;
echo $time;
Asar
На сайте с 23.08.2004
Offline
334
#9

Хм, и правда. Спасиб!

[umka]
На сайте с 25.05.2008
Offline
456
#10

Почитайте документацию MySQL:

1. EXPLAIN

2. SHOW PROFILES

может поможет

Лог в помощь!

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