SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.11.2012 08:13:19

animegirl
Активист
Зарегистрирован: 28.07.2011
Сообщений: 288

Нелогичность обработки запроса

SELECT *
                    FROM `way`.`user_main_location` INNER JOIN `way`.`user_profile` ON `user_profile`.`uid`=`user_main_location`.`uid` INNER JOIN `way`.`user_friends` ON `user_friends`.`uid`=`user_main_location`.`uid`
                    WHERE ((`user_main_location`.`latitude` BETWEEN 20 AND 30) AND (`user_main_location`.`longitude` BETWEEN 20 AND 30))
                        AND `user_friends`.`group_id`=1 AND user_profile.nickname='qwert'
                        AND
                            (
                                (
                                    user_profile.firstname_access>=3
                                OR
                                    (user_friends.friends_ids REGEXP '^(118)$|^(118,.*)$|^(.*,118)$|^(.*,118,.*)$' AND user_profile.firstname_access>=2)
                                OR
                                    user_profile.uid=118
                                )
                            AND
                                user_profile.firstname='abcde'
                            )


Прогон запроса через EXPLAIN extended выдал странную картину:
id     select_type     table     type     possible_keys     key     key_len     ref     rows     filtered     Extra
1     SIMPLE     user_friends     ALL     PRIMARY     NULL     NULL     NULL     4     75.00     Using where
1     SIMPLE     user_main_location     eq_ref     PRIMARY,latitude,longitude     PRIMARY     4     way.user_friends.uid     1     100.00     Using where
1     SIMPLE     user_profile     eq_ref     PRIMARY     PRIMARY     4     way.user_friends.uid     1     100.00     Using where

Я верно поняла, что запрос полез сначало в таблицу знакомых, зачем-то делал поиск по WHERE хотя связка по primary индексу, и выходит перебирал все записи...
Остальные таблицы тоже не были использованы с индексами, почему?


Скажи миру - НЯ!

Неактивен

 

#2 25.11.2012 11:09:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Нелогичность обработки запроса

animegirl написал:

Я верно поняла, что запрос полез сначало в таблицу знакомых

Да.

animegirl написал:

зачем-то делал поиск по WHERE хотя связка по primary индексу

Кроме связки есть ещё условие WHERE smile

animegirl написал:

и выходит перебирал все записи...

Раз нет подходящего индекса, то full scan. Другой альтернативы просто нет.

animegirl написал:

Остальные таблицы тоже не были использованы с индексами, почему?

Почему не были? Доступ к остальным таблицам по значению PRIMARY ключа.


P.S. Показывайте план запроса в виде explain select ... \G
а то неудобно его читать.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson