[Index]组合索引(Composite Index)中多个字段的顺序

本文探讨了在数据库中创建组合索引时,字段顺序选择的重要性。重点指出,应将越离散的字段置于索引的前列,以优化查询效率。尽管在使用等号条件时字段顺序对效率影响较小,但合理布局仍能显著提高性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个表中有三个字段,XX,YY,ZZ,如果要建立给这三个字段建组合索引(Composite Index),组合索引中字段的顺序应该遵循怎样一个原则。

一般的原则:越离散的字段越靠前。哪个列可以降低索引的扫描成本就放在前面。

比如:下位三个字段的离散情况
XX:2
YY:1000
ZZ:50000

那么建立索引的顺序应该为:ZZ,YY,XX

CREATE INDEX t_idx ON t (zz,yy,xx);


但是如果where条件中,三个字段的条件都是通过"="号连接的,那么组合索引中字段的顺序就是无所谓了。

Refer:https://forums.oracle.com/forums/thread.jspa?threadID=2425684

Because you are using equality conditions in your predicate, then the order should be XX, YY, ZZ for maximum compression. Others are suggesting ZZ should be first because it is more selective (probably). But if you are using equals (=) for all 3, then that really does not matter.


或者It’s Less Efficient To Have Low Cardinality Leading Columns In An Index (Right) ? (轻功需好)

In actual fact, there’s no real difference in navigating to the specific leaf block of interest for an index on (ID, CODE) compared to an index based on (CODE, ID), providing both indexed columns are known.


再或者 http://www.oraclemagician.com/white_papers/index_order.pdf

Consider the following indexes:
INDEX1: (ZIP_CODE, GENDER)
INDEX2: (GENDER, ZIP_CODE)
Assume we are looking for the combination of Zip_Code = 94568 and Gender = ‘Male.’ Before Oracle traverses the index, it combines the two conditions. The composite value, something like 94568_Male has the same discriminatory value as Male_94568.

任务描述 本关任务:按照要求完成索引的创建。 相关知识 为了完成本关任务,你需要掌握: 索引是什么; 索引的分类; 索引的创建和删除; 查询索引索引是什么 数据库索引是一种提高数据库系统性能的方法。索引能让数据库服务器更快地查找和获取表中指定的行。 例如,为了方便读者快速查找书中的术语,很多书籍在最后附加了索引页,术语按字母排序,同时给出页码。这样读者可以根据术语名,快速获取页码,而不用翻阅整本书。 但是索引也给数据库系统带来了一定的开销,所以我们应该谨慎地使用它们。 例如现在有一张简单的表: create table test ( id int not null, content varchar(255) not null ) 在这张表中假设存了1000条数据(id依次递增且不重复),我们要查询表中id=234的数据,sql如下: select * from test where id = 234; 一般情况,在没有索引下,数据库系统必须扫描整个表(一行一行地检查),才能获取到所有满足条件的行,很明显这种方法的效率是非常低的。 那么肯定有优化的方法,就是 索引 了!在id字段上添加索引,这样 MySQL 就只需要扫描一行数据就可以了。 索引的分类 索引大体可分为单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引四类。本实训我们主要介绍单例索引组合索引: 单例索引:一个索引只包含单个列,但一个表中可以有多个单列索引; 普通索引:仅加速查询 最基本的索引,没有任何限制,是我们大多数情况下使用到的索引; 唯一索引索引列中的值必须是唯一的,但允许为空值; 主键索引:是一种特殊的唯一索引,不允许有空值。 组合索引:在表的多个字段上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。 索引的创建和删除 创建索引 创建索引有两种方式,一种是在建表时创建,另一种是建表后创建: 普通索引: 创表时创建普通索引: CREATE table mytable( id INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username) ); 建表后创建普通索引: create INDEX 索引名称 on 表名(字段); #或者 ALTER TABLE 表名 ADD INDEX 索引名称 (字段); 唯一索引: CREATE UNIQUE INDEX 索引名称 ON 表名(字段); #或者 ALTER TABLE 表名 ADD UNIQUE (字段); 主键索引:主键索引一般在建表时创建,会设为 int 而且是 AUTO_INCREMENT自增类型的,例如一般表的id字段。 CREATE TABLE mytable ( id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ); 组合索引组合索引就是在多个字段上创建一个索引。(应用场景:当表的行数远远大于索引键的数目时,使用这种方式可以明显加快表的查询速度) CREATE INDEX 索引名称 ON 表名(字段1,字段2,字段3); #或者 ALTER TABLE 表名 ADD INDEX 索引名称(字段1,字段2,字段3); 删除索引 同样,删除索引也有两种方式。 #使用drop删除索引 drop index index_name on table_name ; #使用alter删除索引 alter table table_name drop index index_name ; alter table table_name drop primary key ; #删除主键索引 查询表中索引 查询索引 SQL: show index from 表名; 如下图: 查询结果部分字段解释: 字段名 说明 Table 创建索引的表 Non_unique 表示索引非唯一,1代表非唯一索引,0代表唯一索引,意思就是该索引是不是唯一索引 Key_name 索引名称 Seq_in_index 表示该字段索引中的位置,单列索引的话该值为1,组合索引为每个字段索引定义中的顺序(只需要知道单列索引该值就为1,组合索引为别的) Column_name 表示定义索引的列字段 Sub_part 表示索引的长度 Null 表示该字段是否能为空值 Index_type 表示索引类型 编程要求 在右侧编辑器补充代码,要求如下: ① 在创建student表结构时为stu_id字段创建名为pk_student的主键索引; ②
最新发布
05-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值