gpt4 book ai didi

Mysql查询优化

转载 作者:行者123 更新时间:2023-11-29 14:49:59 25 4
gpt4 key购买 nike

有以下查询:

  SELECT tbl_yaca_sites.`id_site` FROM `tbl_yaca_sites`
INNER JOIN `tbl_relation` ON tbl_relation.id_website = tbl_yaca_sites.id_site
INNER JOIN `tbl_yaca_directories` ON tbl_yaca_directories.id_record = tbl_relation.id_category
INNER JOIN `tbl_applications` ON tbl_applications.id_site = tbl_yaca_sites.id_site
where
tbl_applications.id_application IN (41)
and tbl_yaca_directories.type = 0
AND tbl_yaca_directories.work = 1
AND tbl_relation.work = 1 GROUP BY tbl_yaca_sites.`id_site`

有很多索引:

  1. tbl_yaca_sites - 用于主 id_site 和另一个 id_site(相同字段,但另一个索引)
  2. tbl_relation - 用于主 ID 和组合索引(id_site、id_category、work)
  3. tbl_yaca_directories - 用于主 id_record 和组合索引“type”(类型、工作)
  4. tbl_applications - 没有主要的。有一个索引 id_application。

当我仅设置描述的索引(但没有“分组依据”)时,查询效果很好。我测试了很多次。

因此,如果我在不使用 group by 的情况下运行此查询,则需要一秒钟的时间。足够好的结果,每个表中大约有 200 000 条记录。添加“分组依据”,始终需要 16 秒。

如果我执行以下操作:

SELECT id_site FROM (SELECT tbl_yaca_sites.`id_site` FROM `tbl_yaca_sites`
INNER JOIN `tbl_relation` ON tbl_relation.id_website = tbl_yaca_sites.id_site
INNER JOIN `tbl_yaca_directories` ON tbl_yaca_directories.id_record = tbl_relation.id_category
INNER JOIN `tbl_applications` ON tbl_applications.id_site = tbl_yaca_sites.id_site
where
tbl_applications.id_application IN (41)
and tbl_yaca_directories.type = 0
AND tbl_yaca_directories.work = 1
AND tbl_relation.work = 1 ) as tbl GROUP BY id_site

需要 1.7 秒。

这是解释查询:

1, 'SIMPLE', 'tbl_yaca_sites', 'index', 'PRIMARY,id_site', 'PRIMARY', '4', '', 102358, 'Using index'
1, 'SIMPLE', 'tbl_applications', 'ref', 'pair', 'pair', '8', 'webservices.tbl_yaca_sites.id_site,const', 1, 'Using index'
1, 'SIMPLE', 'tbl_relation', 'ref', 'comb', 'comb', '4', 'webservices.tbl_yaca_sites.id_site', 1, 'Using where; Using index'
1, 'SIMPLE', 'tbl_yaca_directories', 'eq_ref', 'PRIMARY,type', 'PRIMARY', '4', 'webservices.tbl_relation.id_category', 1, 'Using where'

还尝试添加 count(*) |计数(id_site)|计数(1)。结果是一样的。

为什么这么久?谁能告诉我我错过了什么?

提前谢谢大家!

最佳答案

您也可以尝试:

SELECT DISTINCT tbl_yaca_sites.`id_site`
FROM `tbl_yaca_sites`
INNER JOIN `tbl_relation` ON tbl_relation.id_website = tbl_yaca_sites.id_site
INNER JOIN `tbl_yaca_directories` ON tbl_yaca_directories.id_record = tbl_relation.id_category
INNER JOIN `tbl_applications` ON tbl_applications.id_site = tbl_yaca_sites.id_site
WHERE
tbl_applications.id_application IN (41)
AND tbl_yaca_directories.type = 0
AND tbl_yaca_directories.work = 1
AND tbl_relation.work = 1

关于Mysql查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5971040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com