索引失效
1.对索引列进行操作(计算、函数、自动或手动类型转换)
2.使用!=或者<>
3.is null,is not null
4.like 以通配符开头(“%abc”)
5.字符串不加单引号索引失效
6.使用or
使用索引要遵循最佳左前缀
主键索引与唯一索引
| 保证唯一性 | 是否允许为空 | 一个表中可以有多少个 | 能否组合 |
---|---|---|---|---|
primary key(主键索引) | √ | × | 至多一个 | √ |
unique key(唯一索引) | √ | √ | 可以有多个 | √ |
聚族索引
聚簇索引并不是一种单独的索引类型,而是一种存储数据的方式。
mysql的innodb存储引擎就是聚族索引
采用的数据结构是b+树 b+树的非叶子节点存储的是索引,在叶子节点存储的是数据,
分为一级索引和二级索引,一级索引的叶子节点存储的就是数据(row),二级索引的叶子节点存储的是主键
一级索引也就是聚族索引(索引和数据在一起)
InnoDB存储引擎通过主键聚集数据(聚簇索引),如果没有定义主键,InnoDB会选择一个非空的唯一索引代替。如果没有唯一索引,InnoDB会隐式定义一个主键来作为聚簇索引。
非聚簇索引中,一级索引和二级索引没有任何区别,叶子节点存储的是数据的指针,不是数据本身,这一点和聚簇索引是不一样的。
上面两个图很清楚的反映了聚簇索引和非聚簇索引在存取逻辑上的差别,由于聚簇索引的索引和数据聚集在一起,所以查找的时候理论上要更快,
而非聚簇索引通过索引只能找到数据的地址,最终还要通过地址去找数据,所以理论上更慢一些。
聚簇索引中通常会按照自增id作为主键,这对高并发插入可能会有锁争情况,通过设置 innodb_autoinc_lock_mode来平衡
Mysql 中 MyISAM 和 InnoDB 的区别
1.支持事务
2.支持行级锁,只支持表锁
3.支持外键
4.存储的数据方式不同
innodb使用b+树(聚族索引)
#一个是存储数据和索引;一个是存储索引。
myisam使用非聚族索引,有3个文件,
一个存储表定义文件;一个存储数据文件;一个存储索引文件