![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 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 эксперты |
|||
|
||||
| Рыжий |
|
|||
![]() Помешанный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1423 Регистрация: 19.9.2004 Репутация: 1 Всего: 20 |
TNT86, Как мне показалось - оптимизировать тут нечего
Varchar - это символьный тип данных. В него можно "положить" Строку длинной максимум - 255. И в памяти она занимает K+1 байт. K - длинна хранимой в ячейке строки. Mediumint - числовой тип данных. Может хранить данные от -8 388 608 до 8 388 608. Занимает 3 Байта. |
|||
|
||||
| Glip |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 а может всё что я написал полный бред. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
что понимается под производительностью? полезно изучать то, что выдает тебе explain. а вообще, как мне кажется, как единственное средство связи двух таблиц - с вопросами и ответами, выглядит подозрительно. я бы смотрел, в первую очередь, на структуру базы и на связи между таблицами. не скромничай, вполне похоже на правду. в смысле, вполне может дать результат. но я бы все равно хотел бы видеть структуру базы. Добавлено @ 23:10 правильно. а вот ссылка на то, как пользоваться explain: MySQL AB :: MySQL 5.1 Reference Manual :: 7.2.1 Optimizing Queries with EXPLAIN |
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 9 Всего: 401 |
Насколько я понимаю, ans.number - одно значение для каждой записи. В таком случае на кой вообще IN() - можно же просто написать !=. Если же там список чисел через запятую, то, имхо, нужно делать нормальную нормализацию (сорри за тавтологию;), выносить связи в отдельную таблицу и действительно делать LEFT JOIN по условию IS NULL. Потому что иначе индексы идут лесом... -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 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 эксперты |
|||
|
||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Жуткие тормоза возникают, если делать запрос
FROM questions as q1,answered as ans У меня такое подозрение что общее количество операций возрастает пропорционально количеству записей в answered --------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |