索引的概念
索引(Index)是帮助MySQL高效获取数据的数据结构,通俗来讲索引就好比书本的目录,加快数据库的查询速度。
索引的作用
1.提高查询效率
2. 消除数据分组、排序
3.避免“回表”查询(索引覆盖)
4.优化聚合查询
5. 用于多表JOIN关联查询
6.利用唯一性约束,保证数据唯一性
7.InnDB行锁实现
索引的副作用
1.增加I/O成本
2.增加磁盘空间
3.不合适的索引或索引过多,会降低增删改的效率
建立索引的原则
1) 定义主键的数据列一定要建立索引。 2) 定义有外键的数据列一定要建立索引。 3) 对于经常查询的数据列最好建立索引。 4)
对于需要在指定范围内的快速或频繁查询的数据列; 5) 经常用在WHERE子句中的数据列。 6) 经常出现在关键字order by、group
by、distinct后面的字段,建立索引。 如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致,否则索引不会被使用。 7)
对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。 8) 对于定义为text、image和bit的数据类型的列不要建立索引。 9)
对于经常存取的列避免建立索引 10) 限制表上的索引数目。对一个存在大量更新操作的表,所建索引的数目一般不要超过3个,最多不要超过5个。
索引虽说提高了访问速度,但太多索引会影响数据的更新操作。 11)
对复合索引,按照字段在查询条件中出现的频度建立索引。在复合索引中,记录首先按照第一个字段排序。
对于在第一个字段上取值相同的记录,系统再按照第二个字段的取值排序,以此类推。
索引创建
1.create方式创建索引:
普通索引
CREATE INDEX index_name ON table_name(column_name,column_name) include(score)
非空索引
CREATE UNIQUE INDEX index_name ON table_name (column_name) ;
主键索引
CREATE PRIMARY KEY INDEX index_name ON table_name (column_name) ;
2.alter方式创建索引
alter table table_name add index index_name (column_list) ; alter table
table_name add unique (column_list) ; alter table table_name add primary key
(column_list) ;
删除索引
1.drop方式删除索引
drop index index_name on table_name ;
2.alter方式删除索引
alter table table_name drop index index_name ; alter table table_name drop
primary key ;
索引的使用
索引使用时满足最左前缀匹配原则,即对于组合索引(col1,
col2),在不考虑引擎优化时,条件必须是col1在前col2在后,或者只使用col1,索引才会生效;
索引不包含有NULL值的列
一个查询只使用一次索引,where中如果使用了索引,order by就不会使用
like做字段比较时只有前缀确定时才会使用索引
在列上进行运算后不会使用索引,如year(start_time)<2020不会使用start_time上的索引