Помогите с производительностью: SUBQUERY vs JOIN - PullRequest
0 голосов
/ 19 августа 2011

это моя проблема:

ПОДПИСЬ 2.7 secs

SELECT SQL_NO_CACHE 
  item_id

  FROM
    mtrt_items_searches

  WHERE
    search_id IN (      
            SELECT 
            SQL_NO_CACHE
                search_id
                FROM
                    mtrt_searches_groups
                WHERE 
                    client_id =1
                GROUP BY 
                    search_id

        )

    LIMIT 0,350000

+----+--------------------+----------------------+-------+---------------+-----------+---------+-------+--------+--------------------------+
| id | select_type        | table                | type  | possible_keys | key       | key_len | ref   | rows   | Extra                    |
+----+--------------------+----------------------+-------+---------------+-----------+---------+-------+--------+--------------------------+
|  1 | PRIMARY            | mtrt_items_searches  | index | NULL          | search_id | 12      | NULL  | 367362 | Using where; Using index |
|  2 | DEPENDENT SUBQUERY | mtrt_searches_groups | ref   | client_id     | client_id | 4       | const |     13 | Using where; Using index |
+----+--------------------+----------------------+-------+---------------+-----------+---------+-------+--------+--------------------------+

Один только подзапрос возвращает 0,0009 секунд, чтобы вернуть следующие данные, и при замене подзапроса этими данными запрос выполняется в 0.2 secs:

SELECT SQL_NO_CACHE
    item_id

    FROM
        mtrt_items_searches
    WHERE
        search_id IN (
            1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35
        )

    LIMIT 0,350000

+----+-------------+---------------------+-------+---------------+-----------+---------+------+--------+--------------------------+
| id | select_type | table               | type  | possible_keys | key       | key_len | ref  | rows   | Extra                    |
+----+-------------+---------------------+-------+---------------+-----------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | mtrt_items_searches | index | search_id     | search_id | 12      | NULL | 367362 | Using where; Using index |
+----+-------------+---------------------+-------+---------------+-----------+---------+------+--------+--------------------------+

Наконец, JOIN работает в 0.4 secs:

   SELECT SQL_NO_CACHE
        r.item_id

        FROM
            mtrt_items_searches r
        INNER JOIN 
            mtrt_searches_groups sg 
                ON r.search_id =sg.search_id
        WHERE 
            sg.client_id =1
        GROUP BY 
            r.item_id

        LIMIT 0,350000

+----+-------------+-------+------+---------------------+-----------+---------+------------------------+-------+----------------------------------------------+
| id | select_type | table | type | possible_keys       | key       | key_len | ref                    | rows  | Extra                                        |
+----+-------------+-------+------+---------------------+-----------+---------+------------------------+-------+----------------------------------------------+
|  1 | SIMPLE      | sg    | ref  | search_id,client_id | client_id | 4       | const                  |    13 | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | r     | ref  | search_id           | search_id | 4       | clubr_new.sg.search_id | 26240 | Using index                                  |
+----+-------------+-------+------+---------------------+-----------+---------+------------------------+-------+----------------------------------------------+

Я пытаюсь выполнить подзапрос или объединение в 0.2 secs. Возможно ли это?

Ответы [ 3 ]

3 голосов
/ 19 августа 2011

Попробуйте следующий запрос:

SELECT STRAIGHT_JOIN item_id
FROM (
    SELECT DISTINCT search_id
    FROM mtrt_searches_groups
    WHERE client_id = 1
) JOIN mtrt_items_searches USING(search_id)
LIMIT 0,350000
1 голос
/ 19 августа 2011

попробуйте добавить следующие индексы

mtrt_items_searches(search_id,item_id)
mtrt_searches_groups(client_id, search_id)
0 голосов
/ 19 августа 2011

Мммм, я так не думаю. Подзапросы слишком медленные, к сожалению, самый быстрый способ - использовать данные напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...