1 (изменено: элекроник, 2012-03-02 01:13:05)

Тема: вопрос по оптимизации нескольких запросов

здравствуйте
с вашего позволения сначала, напишу что нужно, потом как я это делаю, ну и потом вопросы :)

нужно:
1. выбрать все записи, из таблицы `tabletest` где `id`='$id'
2. выбрать `id` из таблицы `tabletest` где `id`<'$id' и `username`='aaa' LIMIT 1
3. выбрать `id` из таблицы `tabletest` где `id`>'$id' и `username`='aaa' LIMIT 1
4. подсчитать сколько всего строк в таблице `tabletest` где `username`='aaa'

5. сделать запрос к другой таблице `tabletest_a`, и выбрать что-то одно, где что-то равно что-то (этот запрос я оставлю как есть, просто перечисляю и его тоже, чтобы у вас была общая картина страницы)
6. сделать запрос к другой таблице `tabletest_b`, сколько и что там выбирать, я ещё не в курсе, но уверен что этот запрос будет (тоже для общей картины)

делаю так: (всё работает как нужно)
1. $res = mysql_query("SELECT * FROM `tabletest` WHERE `id`='$id'",$db);
2. $res = mysql_query("SELECT `id`,`username` FROM `tabletest` WHERE `id`<'$id' AND `username`='aaa' ORDER BY `id` DESC LIMIT 1",$db);
3. $res = mysql_query("SELECT `id`,`username` FROM `tabletest` WHERE `id`>'$id' AND `username`='aaa' ORDER BY `id` LIMIT 1",$db);
4. $res = mysql_query("SELECT COUNT(*) FROM `tabletest` WHERE `username`='aaa'",$db);

5. -
6. -

как мне всё это оптимизировать?
то есть какие запросы лучше объединить, а какие оставить отдельными?
(интересуют запросы 1,2,3,4, а остальные 5,6 только для наглядности, чтобы вы знали сколько их всего на странице)

2

Re: вопрос по оптимизации нескольких запросов

Насколько я вижу, объединить можно 2-ой и 3-ий запрос, конечно, если это годится для получения данных. В данном случае запрос находит записи имеющие различные идентификаторы, но одинаковое имя в поле `username`.
$res = mysql_query("SELECT `id`,`username` FROM `tabletest` WHERE `id`!= '$id' AND `username`='aaa' LIMIT 1",$db);

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

3 (изменено: элекроник, 2012-03-03 17:59:06)

Re: вопрос по оптимизации нескольких запросов

Hanut, большое спасибо за ответ!

Hanut
Насколько я вижу, объединить можно 2-ой и 3-ий запрос, конечно, если это годится для получения данных.

мне это уже советовали, но я не знаю как правильно это сделать:
1. чтобы запрос был правильный и не тормозил "больше" чем, если бы эти 2 запроса так и остались отдельно
2. не понимаю как мне потом "вывести" через php, этот результат, не используя цикл
(чтоб полученные данные были например в таком виде $id_prev и $id_next)

Hanut
$res = mysql_query("SELECT `id`,`username` FROM `tabletest` WHERE `id`!= '$id' AND `username`='aaa' LIMIT 1",$db);

это не совсем то, что мне надо, а надо вот что:

есть "страница 1" (там выводятся все превью/картинки где, например, `username`='aaa')
(нажимая на любую картину, переходим по "ссылке?id=..." на "страницу 2")

есть "страница 2", куда мы перешли, и взяли с собой значение переменной $id, и также мы знаем (не важно откуда) что нужно выбирать `username`='aaa'.
например: $id=15 ("ссылке?id=15")
нужно выбрать `id`<$id LIMIT 1 (то есть выберем `id`=14) и `id`>$id LIMIT 1 (то есть 16)
(и это если в базе не удалено поле с `id`=14 или `id`=16, если удаленно поле, например, где `id`=14, то будет так:
`id`<$id LIMIT 1 (то есть 13, так как 14-нету) и `id`>$id LIMIT 1 (то есть 16))
(как писал в первом сообщении, эти 2 `id` выбираются ещё и по `username`='aaa')

одним словом это будет "навигация", с кнопками [предыдущая] [следующая]
(где на примере с $id=15 [предыдущая=16] а [следующая=14], а то что посередине, то есть 15 уже можно будет выводить только по `id` не трогая `username`='aaa')

я сделал специально пример, этими двумя запросами, посмотрите [ ссылка ] пожалуйста

2. $res = mysql_query("SELECT `id`,`username` FROM `tabletest` WHERE `id`<'$id' AND `username`='aaa' ORDER BY `id` DESC LIMIT 1",$db);
3. $res = mysql_query("SELECT `id`,`username` FROM `tabletest` WHERE `id`>'$id' AND `username`='aaa' ORDER BY `id` LIMIT 1",$db);

Hanut
Количество запросов на странице большого значения не имеет. ...

за это тоже спасибо, а то точек зрения много, а в мануалах не всегда понятно "для моего уровня знаний" написано

пс: все данные, на "страница 1", выводятся в обратном порядке (ORDER BY `id` DESC) соответственно нужно будет это учесть на странице "страница 2"
псс: извините за возможно запутанное объяснение, уже не один день решаю как сделать/сделать правильно/сделать лучше
пссс: ссылку на фрихост с примером, уберу, как только вы ответите/значит посмотрели

4

Re: вопрос по оптимизации нескольких запросов

В таком случае я не вижу возможности что-то изменить и улучшить.

5 (изменено: элекроник, 2012-03-02 16:14:58)

Re: вопрос по оптимизации нескольких запросов

имеете введу что от "какого-то такого" варианта (то есть объединённого похожим образом)

$res = mysql_query("select `id` as `id_prev`, (select `id` from `tabletest` where `id` > $id order by `id` limit 1) as `id_next` from `tabletest` where `id` < $id order by `id` desc limit 1",$db);

страница будет загружаться "дольше"/"одинаково" чем если оставить два отдельных запроса, как сейчас/как в примере?

6

Re: вопрос по оптимизации нескольких запросов

Если в phpMyAdmin перед запросом SELECT поставить EXPLAIN, то можно посмотреть анализ выполнения запроса MySQL. Думаю два отдельных запроса будет лучше, чем объединенные в один подзапрос.

7 (изменено: элекроник, 2012-03-02 17:36:25)

Re: вопрос по оптимизации нескольких запросов

Hanut сказал:

посмотреть анализ выполнения запроса MySQL

этот?
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
если этот, то не понятно где указанна скорость выполнения запроса
(или если скорость неуказанна, то каким образом её можно определить)

Hanut сказал:

Думаю два отдельных запроса будет лучше, чем объединенные в один подзапрос.

значит в моём случаи, ничего лучше двух отдельных запросов, придумать нельзя? правильно понимаю?
а в каких случаях, лучше запросы объединять? (скажите хотя бы вкратце, если это возможно)

8

Re: вопрос по оптимизации нескольких запросов

Скорость выполнения запроса видна в phpMyAdmin, в самом верху результатов.

Данные полученные от EXPLAIN используются для анализа выполнения запроса и определения полей индексации.

элекроник сказал:

а в каких случаях, лучше запросы объединять?

Объединять запросы надо только в том случае, если без этого нельзя обойтись, например при необходимости сортировки данных выбираемых из двух таблиц.

9 (изменено: элекроник, 2012-03-02 21:35:20)

Re: вопрос по оптимизации нескольких запросов

(запрос занял 0.0005 сек) если вы про эту скорость, но она же там постоянно разная :) даже если проверять один и тот же вопрос. но вообщем не хочется быть навязчивым, поэтому спасибо за ответы!
главное что двумя запросами, как у меня - правильно :) за этим я и создавал тему

10

Re: вопрос по оптимизации нескольких запросов

элекроник сказал:

но она же там постоянно разная

Она и при реальном выполнении любого запроса будет разной; в некоторых пределах.

Re: вопрос по оптимизации нескольких запросов

Hanut сказал:

в некоторых пределах.

и за это тоже :)