Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация запроса 
:(
    Опции темы
TNT86
Дата 4.3.2007, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 14.8.2006
Где: Одесса

Репутация: нет
Всего: нет



Очень нужно как можно сильнее заоптимизировать запрос

 SELECT q1.question , q1.number , q1.expert_id , q1.date
 FROM questions as q1,answered as ans
 WHERE q1.number NOT IN (ans.number) AND q1.to_id='$expert_id' 
 ORDER BY number DESC
 LIMIT  $rlast, 20;

Буду также благодарен советам, о том как узнать производительность запроса?

Также интересует вопрос почему после перехода с VARCHAR(30) на MEDIUMINT в поле to_id запрос сталнамного дольше работать?

--------------------
виртуальныe MYSQL и  PHP эксперты
PM MAIL WWW   Вверх
Рыжий
Дата 4.3.2007, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: 1
Всего: 20



TNT86, Как мне показалось - оптимизировать тут нечего  smile 

Varchar - это символьный тип данных. В него можно "положить" Строку длинной максимум - 255. И в памяти она занимает K+1 байт.
K - длинна хранимой в ячейке строки.

Mediumint - числовой тип данных. Может хранить данные от -8 388 608 до 8 388 608. Занимает 3 Байта.

PM MAIL ICQ   Вверх
Glip
Дата 4.3.2007, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 1
Всего: 18



Можно попробовать LEFT JOIN на q1.number =ans.number и в WHERE добавить ans.number IS NULL (или какой там диалект)
вместо q1.number NOT IN (ans.number)

можно посмотреть EXPLAIN
можно попробовать добавить индексы на questions.number и answered.number

а может всё что я написал полный бред.



--------------------
user posted image
PM MAIL   Вверх
skyboy
Дата 4.3.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(TNT86 @  4.3.2007,  20:43 Найти цитируемый пост)
как узнать производительность запроса?

что понимается под производительностью? полезно изучать то, что выдает тебе explain.
а вообще, как мне кажется, 
Цитата(TNT86 @  4.3.2007,  20:43 Найти цитируемый пост)
q1.number NOT IN (ans.number)

как единственное средство связи двух таблиц - с вопросами и ответами, выглядит подозрительно. я бы смотрел, в первую очередь, на структуру базы и на связи между таблицами.
Цитата(Glip @  4.3.2007,  22:01 Найти цитируемый пост)
а может всё что я написал полный бред.

не скромничай, вполне похоже на правду. в смысле, вполне может дать результат. smile
но я бы все равно хотел бы видеть структуру базы.

Добавлено @ 23:10 
Цитата(TNT86 @  4.3.2007,  20:43 Найти цитируемый пост)
как узнать производительность запроса?

Цитата(Glip @  4.3.2007,  22:01 Найти цитируемый пост)
можно посмотреть EXPLAIN

правильно. а вот ссылка на то, как пользоваться explain: MySQL AB :: MySQL 5.1 Reference Manual :: 7.2.1 Optimizing Queries with EXPLAIN
PM MAIL   Вверх
SelenIT
Дата 5.3.2007, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 9
Всего: 401



Цитата(TNT86 @  4.3.2007,  21:43 Найти цитируемый пост)
NOT IN (ans.number)

Насколько я понимаю, ans.number - одно значение для каждой записи. В таком случае на кой вообще IN() - можно же просто написать !=.

Если же там список чисел через запятую, то, имхо, нужно делать нормальную нормализацию (сорри за тавтологию;), выносить связи в отдельную таблицу и действительно делать LEFT JOIN по условию IS NULL. Потому что иначе индексы идут лесом...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
TNT86
Дата 7.3.2007, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 14.8.2006
Где: Одесса

Репутация: нет
Всего: нет



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

number - это фактически номер реплики
refto     -  номер реплики к которой относится данная (если это первая фраза в разговоре refto=0)
question - сам вопрос
expert_id  - id эксперта
to_id         - id эксперта которому посвящена реплика

questions содержит
questions 
Поле            Тип                      Ноль    По умолчанию
number    bigint(20)             Нет         
refto    bigint(20)            Да    0     
question    varchar(200)    Да    NULL     
expert_id    mediumint(9)    Нет    0     
date    datetime    Да    0000-00-00 00:00:00     
to_id    mediumint(9)    Нет    0     

 Индексы: Имя ключа    Тип    Количество элементов    Поле
PRIMARY    PRIMARY    4034    number 
expert_id    INDEX    32    expert_id 
to_id    INDEX    31    to_id 
question_2    FULLTEXT    1    question
____________________________________________________________________________

answered временная таблица построенная двумя запросами

create temporary table expert_replies
SELECT number
FROM questions 
WHERE expert_id='$expert_id'


create temporary table answered
SELECT refto as number
FROM questions,expert_replies
WHERE questions.number = expert_replies.number
_____________________________________________________________________________


Исходный запрос выбирает "вопросы" к эксперту, на которые он не отвечал.

Всем за спасибо за уже приведенные советы
--------------------
виртуальныe MYSQL и  PHP эксперты
PM MAIL WWW   Вверх
TNT86
Дата 8.3.2007, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 14.8.2006
Где: Одесса

Репутация: нет
Всего: нет



Жуткие тормоза возникают, если делать запрос
FROM questions as q1,answered as ans
У меня такое подозрение что общее количество операций возрастает пропорционально количеству записей в answered
--------------------
виртуальныe MYSQL и  PHP эксперты
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0874 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.