1.索引简介

  1. 什么是索引:MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。
    可以得到索引的本质:索引是数据结构。
  2. 好处:类似大学图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本,通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
  3. 坏处:1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。
    因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,
    都会调整因为更新所带来的键值变化后的索引信息2.实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的
  4. mysql索引结构:B+Tree索引(后续的文章我会专门研究B+Tree索引这一数据结构,暂时先知道这个概念就行了)
  5. 聚簇索引与非聚簇索引:聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。
    术语‘聚簇’表示数据行和相邻的键值进错的存储在一起。
     如下图,左侧的索引就是聚簇索引,因为数据行在磁盘的排列和索引排序保持一致。

聚簇索引的好处:
按照聚簇索引排列顺序,查询显示一定范围数据的时候,由于数据都是紧密相连,数据库不不用从多个数据块中提取数据,所以节省了大量的io操作。
聚簇索引的限制:
对于mysql数据库目前只有innodb数据引擎支持聚簇索引,而Myisam并不支持聚簇索引。
由于数据物理存储排序方式只能有一种,所以每个Mysql的表只能有一个聚簇索引。一般情况下就是该表的主键。
为了充分利用聚簇索引的聚簇的特性,所以innodb表的主键列尽量选用有序的顺序id,而不建议用无序的id,比如uuid这种。

 

2.索引分类

  1. 单值索引:即一个索引只包含单个列,一个表可以有多个单列索引,语法:CREATE  INDEX idx_customer_name ON customer(customer_name); 
  2. 唯一索引:索引列的值必须唯一,但允许有空值,语法:CREATE UNIQUE INDEX idx_customer_no ON customer(customer_no); 
  3. 主键索引:设定为主键后数据库会自动建立索引,innodb为聚簇索引
  4. 复合索引:即一个索引包含多个列,语法:CREATE  INDEX idx_no_name ON customer(customer_no,customer_name); 

3.哪些情况下使用索引

索引对update的影响_mysql索引

4.哪些情况不使用索引

索引对update的影响_索引对update的影响_02

5.性能分析:Explain

索引对update的影响_sql优化_03

6.各个名词解释

这一模块先不介绍,以后再补

7.索引失效

索引对update的影响_聚簇索引_04

7.1全值匹配我最爱:

索引对update的影响_聚簇索引_05

7.2最佳左前缀法则:如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。

索引对update的影响_聚簇索引_06

7.3:不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描

索引对update的影响_聚簇索引_07

7.4:存储引擎不能使用索引中范围条件右边的列

索引对update的影响_聚簇索引_08

7.5:mysql 在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描

7.6:is not null 也无法使用索引,但是is null是可以使用索引的

7.7:like以通配符开头('%abc...')mysql索引失效会变成全表扫描的操作

7.8:字符串不加单引号索引失效

 

8:关联查询优化