mysql where索引_mysql – 使用索引优化WHERE IN条件

我有一个看起来像下面的表:

CREATE TABLE foo (

type TINYINT, -- low cardinality (2..5)

id BINARY(16), -- high cardinality

other_data OTHERTYPE(n),

CONSTRAINT foo_PK PRIMARY KEY (type, id)

);

访问包含该表的数据库的一个应用程序按类型和标识运行点查询,并按多个(类型,标识)对过滤查询.

问题是:在这些情况下哪个指数表现更好?目前,我将类型列分组并在SELECT * FROM表上执行UNION WHERE type =? AND id IN(?)

首先使用最高基数列的经验法则仍然可行,或者我应该定义(类型,id)索引?

注意:数据库运行在MySQL之上,但考虑其他RDBMS的答案也很有趣.

解决方法:

警告:这个答案适用于MySQL中的InnoDB.它可能不适用于其他MySQL引擎,也不适用于其他RDBMS.

一个主要的关键是

>与数据集群,和

>唯一性约束,和

>一个索引

SELECT * FROM表WHERE type =? AND id IN(?,?,?)最好由PRIMARY KEY(type,id)处理,并按此顺序排列. (第二好的是INDEX(type,id)).

>作为索引,查找不需要扫描整个表.

>群集,查找和*(SELECT *)同时完成.

>独特与此SELECT无关.

>列顺序是必需的,因为=必须先出现.

>如果IN中只有一个项目,IN将优化为=;该指数仍然是最优的.

与一个根深蒂固的妻子的故事相反,类型与身份的基数是不相关的,至少对于这个查询而言.

附注:WHERE中项目的顺序对性能没有影响;索引中的顺序.

在这种情况下,=应首先出现在索引中,然后是更复杂的项目,在这种情况下为IN.

id闻起来像一个打包的UUID.对于可能在所有RDBMS中的可怕类型索引的巨大表,因为它是随机的,因此缓存是不切实际的.

Index Cookbook for MySQL / MariaDB.

标签:mysql,database-design,index-tuning

来源: https://codeday.me/bug/20190806/1602881.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值