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
为什么要将答案作为注释发布?这可能会有所帮助。我会尽快试试这个。我仍在寻找更好的解决方案。