mysql NOT IN QUERY optimize

守給你的承諾、 提交于 2019-12-07 02:06:06

问题


I have two tables named as:

  1. table_product
  2. table_user_ownned_auction

table_product

specific_product_id      astatus  ... 
(primary_key,autoinc)
--------------------------------------
1                        APAST    ...
2                        ALIVE    ...
3                        ALIVE    ...
4                        APAST    ... 
5                        APAST    ...

table_user_ownned_auction

own_id     specific_product_id   details   
----------------------------------------
1                  1               XXXX
2                  5               XXXX

I need to select atatus = APAST, and not in table 2.
Which means, in above structure table1 has 3 APAST status (1,4,5). But in table 2 specific_product_id (1,5) only stored so i need to select specific_product_id = 4

I used this query

  SELECT * 
    FROM table_product 
   WHERE astatus = 'APAST' 
     AND specific_product_id NOT IN (SELECT specific_product_id 
                                       FROM table_user_ownned_auction )

...which takes this long:

Query took 115.1039 sec

...to execute.

EXPLAIN PLAN

How can i optimize it or any other way to select what i want?


回答1:


Try adding a index on the table_user_ownned_auction table:

ALTER TABLE table_user_ownned_auction ADD KEY(specific_product_id)

Also, try using a non-exists join:

SELECT p.*
FROM table_product p
    LEFT JOIN table_user_ownned_auction l
      ON p.specific_product_id = l.specific_product_id
WHERE p.astatus = 'APAST' 
    AND l.specific_product_id IS NULL



回答2:


Using NOT EXISTS

SELECT p.* 
  FROM TABLE_PRODUCT p
 WHERE p.astatus = 'APAST' 
   AND NOT EXISTS (SELECT NULL
                     FROM TABLE_USER_OWNED_AUCTION uoa
                    WHERE uoa.specific_product_id = p.specific_product_id)

Using LEFT JOIN/IS NULL

   SELECT p.* 
     FROM TABLE_PRODUCT p
LEFT JOIN TABLE_USER_OWNED_AUCTION uoa ON uoa.specific_product_id = p.specific_product_id
    WHERE p.astatus = 'APAST' 
      AND uoa.own_id IS NULL

Explanation

The most optimal query can be determined by if the columns compared between the two tables are NULLable (IE: if the values of specific_product_id in either table can be NULL).

  • If nullable, NOT IN or NOT EXISTS is the best choice in MySQL
  • If NOT nullable, `LEFT JOIN/IS NULL is the best choice in MySQL

Addendum

Once the optimal query has been determined, take a look at creating indexes (possibly covering indexes) for at least:

  • specific_product_id
  • TABLE_PRODUCT.astatus


来源:https://stackoverflow.com/questions/6120100/mysql-not-in-query-optimize

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!