数据库
首页 > 数据库> > mysql – 使用索引优化WHERE IN条件

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