gpt4 book ai didi

MySQL查询优化,主键索引不使用?

转载 作者:行者123 更新时间:2023-11-29 22:30:22 35 4
gpt4 key购买 nike

我们有很多这样的问题,但每个查询都是唯一的,所以出现了这个问题。我有以下查询

Select * from tblretailerusers where (company_id=169 or company_id in (select id from tblretailercompany where multi_ret_id='169')) and ( id in (Select contact_person_1 from tbllocations where status=1 and (retailer_comp_id=169 or retailer_comp_id in (select id from tblretailercompany where multi_ret_id='169'))) OR id in(Select contact_person_2 from tbllocations where status=1 and (retailer_comp_id=169 or retailer_comp_id in (select id from tblretailercompany where multi_ret_id='169'))) ) and (last_login is not null )

它包含三个表,涉及零售商、位置和用户。标准用户信息。每个零售商都可以有子零售商,因此零售商表有父零售商 ID。目前每个表大约有 6K 记录,所有表都有主键作为自动增量,据我所知它们也有索引。在用户表电子邮件字段中建立索引。

现在,此查询需要 < 1 秒,这很好,但现在客户端想要查找其电子邮件 ID 以特定字母开头的用户,例如 ab。一旦我将其添加到查询中,它就会开始花费大约 50-60 秒。我在电子邮件字段上创建索引,该索引不是唯一的,新查询看起来像

Select * from tblretailerusers where (company_id=169 or company_id in (select id from tblretailercompany where multi_ret_id='169')) and  ( id in (Select contact_person_1 from tbllocations where status=1 and (retailer_comp_id=169 or retailer_comp_id in (select id from tblretailercompany where multi_ret_id='169')))  OR      id in(Select contact_person_2 from tbllocations where status=1 and (retailer_comp_id=169 or retailer_comp_id in (select id from tblretailercompany where multi_ret_id='169'))) ) and (last_login is not null ) and email  REGEXP '^A|^B' 

我尝试在两个版本的查询中使用解释,我注意到一个有趣的事实是,在主表行中,它没有显示 possible_key 的任何值,而我们使用的是主键 id 在用户表中搜索,我也在电子邮件字段上有索引。这是查询的解释:

enter image description here

我尝试重新创建索引,当前我有一个索引使用 ID、CompanyID 和 Email,而不是用户表中的主键。我还在公司表上创建了索引,但没有任何方法可以加快速度。用户表是MyISAM。

我的另一个问题是,如何跳过子公司搜索的子查询,正如您所看到的,它在上面的查询中使用了三次。

编辑:我在查询中使用 REGEXP 的原因是,当我尝试 Like 'A%' 时,该选项的速度甚至很慢。

编辑 我只是使用 last_login is null 而不是 last_login is not null 进行测试,结果不到 5 秒。 Null 或 Not Null 不相似吗?

最佳答案

而不是使用正则表达式:

and email  REGEXP '^A|^B' 

...尝试一个简单的 LIKE:

and (email like 'A%' or email like 'B%')

正则表达式对于这个相当小的比较来说有点繁重。喜欢可能会快得多。另外,我不希望优化器尝试解码正则表达式试图执行的操作。然而,通过“赞”,它知道并且可能会使用您设置的索引。

关于MySQL查询优化,主键索引不使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29863968/

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