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