mysql验证索引正确性_MYSQL – 索引和优化选择查询

要使查询引擎使用复合索引中的列,必须首先满足左侧的列.也就是说,必须使用列作为限制,从左到右读取候选行.

OR别名3(或别名4)条款违反了这条规则,因为它说“我不关心左边的部分(别名1或别名2(或alias3))是什么,因为我不依赖于它们”.

然后需要进行全表扫描,以查看是否存在满足条件的alias3(或alias4)值.

这种情况下潜在有用的指数是:

> INDEX(alias1,alias2):alias1 AND alias2涵盖此复合索引

> INDEX(别名3)

> INDEX(别名4)

实际统计数据and plan selection需要进一步调查 – 但至少现在查询计划程序可以使用.

话虽如此 – 而且我不确定“别名”的作用是什么 – 将表格标准化可能是有意义的.以下确实稍微改变了语义,因为它删除了“别名位置”(可以重新添加)并且应该验证语义正确性.

CREATE TABLE `CompanyMaster` (

`CompUID` int(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`CompUID`)

)

-- (This establishes a unique alias-per-company,which may be incorrect.)

CREATE TABLE `CompaniesAliases` (

`CompUID` int(11) NOT NULL,`Alias` varchar(150) NOT NULL

-- Both CompUID and Alias appear in 'first' positions:

-- CompUID for Join,Alias for filter,PRIMARY KEY (`CompUID`,`Alias`),KEY (`Alias`)

-- Alternative,which may change plan selection by eliminating options:

--,PRIMARY KEY (`Alias`,`CompUID`) -- and no single KEY/index on Alias or CompUID,FOREIGN KEY(CompUID) REFERENCES CompanyMaster(CompUID)

)

然后它可以被查询大致类似于原始,不同之处在于它不关心哪个“别名”匹配哪个值:

-- AND constructed by joins (could also use GROUP BY .. HAVING COUNT)

SELECT c.CompUID FROM `CompanyTable` c

JOIN `CompaniesAliases` ac1

ON ac1.CompUID = c.CompUID AND Alias = 'match1'

JOIN `CompaniesAliases` ac2

ON ac2.CompUID = c.CompUID AND Alias = 'match2'

-- OR constructed by union(s)

UNION

SELECT c.CompUID FROM `CompanyTable` c

JOIN `CompaniesAliases` ac1

ON ac1.CompUID = c.CompUID AND (Alias = 'match3' OR Alias = 'match4')

我希望在sql Server中有效地实现这样的查询 – 使用MysqL的YMMV.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值