MySQL:使用嵌套子查询的查询速度非常慢

MySQL:使用嵌套子查询的查询速度非常慢,mysql,mysql-dependent-subquery,Mysql,Mysql Dependent Subquery,查询: SELECT ( SELECT COUNT(cleanpoi.ID) FROM cleanpoi WHERE cleanpoi.EstablishmentID=parent.ID ) AS POIs, ( SELECT COUNT(ID) FROM cleanamenitymappings WHERE CleanPOIID IN ( SELECT cleanpoi.ID

查询:

 SELECT 
    (
        SELECT COUNT(cleanpoi.ID) FROM cleanpoi
        WHERE cleanpoi.EstablishmentID=parent.ID
    ) AS POIs,
    (
        SELECT COUNT(ID) FROM cleanamenitymappings WHERE CleanPOIID IN 
        (
            SELECT cleanpoi.ID FROM cleanpoi
            WHERE cleanpoi.EstablishmentID=parent.ID
        )
    ) AS Amenities,
    (
        SELECT COUNT(ID) FROM cleanamenityvalues WHERE CleanPOIID IN 
        (
            SELECT cleanpoi.ID FROM cleanpoi
            WHERE cleanpoi.EstablishmentID=parent.ID
        )
    ) AS AmenityValues
    FROM establishment parent
    WHERE parent.ID=3
 id  select_type         table                 type             possible_keys                              key              key_len  ref       rows  Extra                     
------  ------------------  --------------------  ---------------  -----------------------------------------  ---------------  -------  ------  ------  --------------------------
     1  PRIMARY             parent                const            PRIMARY                                    PRIMARY          4        const        1  Using index               
     5  DEPENDENT SUBQUERY  cleanamenityvalues    ALL              (NULL)                                     (NULL)           (NULL)   (NULL)   31778  Using where               
     6  DEPENDENT SUBQUERY  cleanpoi              unique_subquery  PRIMARY,EstablishmentID_2,EstablishmentID  PRIMARY          4        func         1  Using where               
     3  DEPENDENT SUBQUERY  cleanamenitymappings  index            (NULL)                                     CleanPOIID       4        (NULL)  673591  Using where; Using index  
     4  DEPENDENT SUBQUERY  cleanpoi              unique_subquery  PRIMARY,EstablishmentID_2,EstablishmentID  PRIMARY          4        func         1  Using where               
     2  DEPENDENT SUBQUERY  cleanpoi              ref              EstablishmentID_2,EstablishmentID          EstablishmentID  4        const      181     
解释结果:

 SELECT 
    (
        SELECT COUNT(cleanpoi.ID) FROM cleanpoi
        WHERE cleanpoi.EstablishmentID=parent.ID
    ) AS POIs,
    (
        SELECT COUNT(ID) FROM cleanamenitymappings WHERE CleanPOIID IN 
        (
            SELECT cleanpoi.ID FROM cleanpoi
            WHERE cleanpoi.EstablishmentID=parent.ID
        )
    ) AS Amenities,
    (
        SELECT COUNT(ID) FROM cleanamenityvalues WHERE CleanPOIID IN 
        (
            SELECT cleanpoi.ID FROM cleanpoi
            WHERE cleanpoi.EstablishmentID=parent.ID
        )
    ) AS AmenityValues
    FROM establishment parent
    WHERE parent.ID=3
 id  select_type         table                 type             possible_keys                              key              key_len  ref       rows  Extra                     
------  ------------------  --------------------  ---------------  -----------------------------------------  ---------------  -------  ------  ------  --------------------------
     1  PRIMARY             parent                const            PRIMARY                                    PRIMARY          4        const        1  Using index               
     5  DEPENDENT SUBQUERY  cleanamenityvalues    ALL              (NULL)                                     (NULL)           (NULL)   (NULL)   31778  Using where               
     6  DEPENDENT SUBQUERY  cleanpoi              unique_subquery  PRIMARY,EstablishmentID_2,EstablishmentID  PRIMARY          4        func         1  Using where               
     3  DEPENDENT SUBQUERY  cleanamenitymappings  index            (NULL)                                     CleanPOIID       4        (NULL)  673591  Using where; Using index  
     4  DEPENDENT SUBQUERY  cleanpoi              unique_subquery  PRIMARY,EstablishmentID_2,EstablishmentID  PRIMARY          4        func         1  Using where               
     2  DEPENDENT SUBQUERY  cleanpoi              ref              EstablishmentID_2,EstablishmentID          EstablishmentID  4        const      181     

对这个问题有什么建议吗?非常感谢您的回答

您的查询确实扫描了700k行,所有这些都需要从磁盘读取。我猜测磁盘性能差(带宽和/或寻道时间)


如果您经常运行此查询,请考虑创建一个实体化视图,它是一个包含整个查询答案的表,当基础数据发生变化时,使用触发器更新它。

< P>我将创建具有中间结果的临时表,然后从这个临时表中选择。p> 创建一个存储过程来实现这一点可能很有用:

delimiter ;;
create procedure MyLongProcedure()
begin
    -- Just in case, drop the temporary tables before creating them
    drop table if exists temp_step01;
    -- Make a temporary table for each subquery
    create temporary table temp_step01
         select ... ;
    -- Be sure to create the appropriate indexes for each temporary table
    alter table temp_step01
         add index .... ;
    -- Create as much tables as you need
    -- Finally, execute your final query using all the tables you just created
    select ... ;
end;;
delimiter ;
记住:临时表只能由创建它们的连接读取。在多用户环境中,这可能很有用。。。或者不,取决于您的具体需求


这只是一个想法。希望它能帮助你。

谢谢你的回答,但这解决了我的问题

SELECT 
    (
        SELECT COUNT(cleanpoi.ID) FROM cleanpoi
        WHERE cleanpoi.EstablishmentID=parent.ID
    ) AS POIs,
    (
        SELECT COUNT(a.ID) 
        FROM cleanamenitymappings a LEFT JOIN cleanpoi b ON a.CleanPOIID=b.ID
        WHERE b.EstablishmentID=parent.ID
    ) AS Amenities,
    (
        SELECT COUNT(a.ID) 
        FROM cleanamenityvalues a LEFT JOIN cleanpoi b ON a.CleanPOIID=b.ID
        WHERE b.EstablishmentID=parent.ID
    ) AS AmenityValues
    FROM establishment parent
    WHERE parent.ID=3

要提高性能,请删除嵌套查询或增加您的
innodb\u buffer\u pool\u size
为什么要将答案作为注释发布?这可能会有所帮助。我会尽快试试这个。我仍在寻找更好的解决方案。