Mysql 如何优化此sql查询(内部联接)
无论如何,是否有优化此查询的方法。执行此查询需要40多秒。我尝试了许多方法,如创建索引。这几乎没有帮助。但查询时间太长Mysql 如何优化此sql查询(内部联接),mysql,optimization,query-optimization,Mysql,Optimization,Query Optimization,无论如何,是否有优化此查询的方法。执行此查询需要40多秒。我尝试了许多方法,如创建索引。这几乎没有帮助。但查询时间太长 SELECT b.id, Count(DISTINCT a.id, c.chapters_id) AS pct, Count(DISTINCT e.id) AS eCount, Count(DISTINCT f.id) AS fCount, Count(DISTINCT d2.id)
SELECT b.id,
Count(DISTINCT a.id, c.chapters_id) AS pct,
Count(DISTINCT e.id) AS eCount,
Count(DISTINCT f.id) AS fCount,
Count(DISTINCT d2.id) AS d2Count,
b.NAME,
e.NAME,
e.address2,
f.NAME,
d2.is_active
FROM tableA a
INNER JOIN tableB b
ON a.modules_id = b.id
INNER JOIN tableC c
ON a.modules_id = c.modules_id
INNER JOIN tableD d1
ON d1.id = b.store_users_id
INNER JOIN tableD d2
ON d2.id = a.store_users_id
INNER JOIN tableE e
ON e.id = d2.stores_id
INNER JOIN tableF f
ON e.city = f.id
WHERE b.type IN( 1, 2, 4 )
AND b.organizations_id = 156
AND b.is_enable = true
GROUP BY b.NAME,b.id
说明
+----+-------------+-------+--------+-----------------------------------------------------------------------------------------------------+-----------------------------+---------+--------------------------+------+---------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-----------------------------------------------------------------------------------------------------+-----------------------------+---------+--------------------------+------+---------------------------------------+
| 1 | SIMPLE | b | range | PRIMARY,fk_modules_organizations1,fk_modules_store_users1,sort_modules_name,wh_modules_type,new_idx | new_idx | 9 | NULL | 160 | Using index condition; Using filesort |
| 1 | SIMPLE | c | ref | fk_module_chapters_modules1 | fk_module_chapters_modules1 | 4 | b.id | 1 | NULL |
| 1 | SIMPLE | d1 | eq_ref | PRIMARY | PRIMARY | 4 | b.store_users_id | 1 | Using index |
| 1 | SIMPLE | a | ref | store_users_id_UNIQUE,fk_user_modules_store_users1,fk_user_modules_modules1 | fk_user_modules_modules1 | 4 | b.id | 149 | NULL |
| 1 | SIMPLE | d2 | eq_ref | PRIMARY,fk_store_users_stores1 | PRIMARY | 4 | a.store_users_id | 1 | NULL |
| 1 | SIMPLE | e | eq_ref | PRIMARY,Stores-Cities | PRIMARY | 4 | d2.stores_id | 1 | Using where |
| 1 | SIMPLE | f | eq_ref | PRIMARY | PRIMARY | 4 | e.city | 1 | NULL |
+----+-------------+-------+--------+-----------------------------------------------------------------------------------------------------+-----------------------------+---------+--------------------------+------+---------------------------------------+
这可能有助于:
INDEX(organizations_id, is_enable, type) -- on b
由于您说的是COUNT(DISTINCT…
,闻起来好像连接正在爆炸行数,然后您正在将它们区分回它们应该在的位置。一种方法是从中执行选择COUNT(*)。。。加入…
而不使用最后的分组依据。如果这是一个比任何表大小都大得多的数字,那么您就遇到了这个经典问题
有时,解决方法是将连接替换为
SELECT ...,
( SELECT COUNT(*) FROM x ... ) AS x_ct, -- instead of `JOIN x`
...
这可能有助于:
INDEX(organizations_id, is_enable, type) -- on b
由于您说的是COUNT(DISTINCT…
,闻起来好像连接正在爆炸行数,然后您正在将它们区分回它们应该在的位置。一种方法是从中执行选择COUNT(*)。。。加入…
而不使用最后的分组依据。如果这是一个比任何表大小都大得多的数字,那么您就遇到了这个经典问题
有时,解决方法是将连接替换为
SELECT ...,
( SELECT COUNT(*) FROM x ... ) AS x_ct, -- instead of `JOIN x`
...
请为您的表提供SHOW CREATE TABLE tablename
语句。这将帮助我们识别任何不正确的数据类型,并查看您有哪些索引。另外,
中的总是只有3个值,还是有所不同?这些价值观从何而来?(即用户输入或以前运行的查询等)您好,感谢您查看我的查询。在中,始终只有3个值(1,2,4)。显示5个表的创建表详细信息太大了。请告诉我,如果你需要显示创建任何特定表表。Thnksy您没有得到任何回复,因为您没有提供明确的信息。提供所有SHOW CREATE TABLE语句,除非您的雇主或类似人士禁止您这样做,否则请更正查询以显示实际的表名和列名,而不是这些假名称。它有助于我们的理解,并降低您在编辑名称时出错的风险。我们可以从EXPLAIN语句中的*\u id
列和键推断出大多数名称。请为您的表提供SHOW CREATE TABLE tablename
语句。这将帮助我们识别任何不正确的数据类型,并查看您有哪些索引。另外,
中的总是只有3个值,还是有所不同?这些价值观从何而来?(即用户输入或以前运行的查询等)您好,感谢您查看我的查询。在中,始终只有3个值(1,2,4)。显示5个表的创建表详细信息太大了。请告诉我,如果你需要显示创建任何特定表表。Thnksy您没有得到任何回复,因为您没有提供明确的信息。提供所有SHOW CREATE TABLE语句,除非您的雇主或类似人士禁止您这样做,否则请更正查询以显示实际的表名和列名,而不是这些假名称。它有助于我们的理解,并降低您在编辑名称时出错的风险。我们可以从EXPLAIN语句中的*\u id
列和键推断出大多数名称。