MySQL高级特性——索引
索引
定义
MySQL官方对索引(index)的定义是:索引是帮助MySQL高效获取数据的数据结构。
在数据库的应用中,索引可以简单理解成是一种排好序的快速查找数据结构。
常见索引:
B树索引 | B+树索引 | 哈希索引 |
---|
优势与劣势
优势:
- 提高数据检索的效率,降低了数据库的IO成本。
- 降低了数据排序的成本,降低了CPU资源的消耗。
劣势:
-
索引保存了主键和索引字段,并指向实体表的记录,索引列需要占用存储空间。
-
索引降低了更新表的速度。
-
维护索引需要成本。
因此,需要频繁查询和排序的字段适合建立索引,主键自动建立唯一索引,外键应建立索引,而需要频繁更新的字段不适合建立索引。
分类
类别 | 含义 |
---|---|
单值索引 | 一个索引只包含单个列,一个表根据列的数目有多个单列索引 |
唯一索引 | 索引列的值必须唯一,但可以包含空值 |
复合索引 | 一个索引包含多个列 |
高并发条件下适合建立复合索引。
SQL语句
操作 | 语句 |
---|---|
创建 | CREATE [UNIQUE] INDEX index_name ON table_name(column_name(length)); ALTER table_name ADD [UNIQUE] INDEX [index_name] ON (column_name(length)); |
删除 | DROP INDEX [index_name] ON table_name; |
查询 | SHOW INDEX [index_name] FROM table_name; |
结构
常见的索引为B+树结构,每个节点对应一个磁盘块
查询数据项29:
第一次IO:则先将磁盘块1加载到内存,内存中二分查找,29位于17和35之间,锁定磁盘块1的P2指针。
第二次IO:再将磁盘块3加载到内存,内存二分查找,29位于26和30之间,锁定磁盘块3的P2指针。
第三次IO:将磁盘块8加载到内存,内存二分查找到29,查询结束。
由于内存做二分查找非常快,因此要尽可能使B+树变得矮胖,即减小深度,增大广度,以减少IO次数,提升查询效率。