MySQL 索引

创作人 Leo


编辑时间 Wed Jan 15,2020 at 10:55


索引

索引是一种提升查询效率的工具,我们一般在创建数据表时对字段创建合适的索引,如果查询中的字段使用到了索引,mysql就能够快速确定数据文件的中间位置,这样就不需要扫描全部数据,能够大幅提升查询效率,索引会影响写入效率,尽量少建低效索引,mysql每次更新会更新索引。
索引应用于以下情况:
1. 查询匹配数据行使用 where 字句
2. 如果匹配到多个可使用索引,mysql选择查询最少行索引 (the most selective index :意思是数据重复度低,数据离散度高),使用 use index 子句可以指定索引
3. 如果数据表有多字段索引(multiple-column,也叫复合索引),则遵循最左原则(leftmost prefix of the index),比如你有 col1,col2,col3 索引,则查询时使用 (col1),(col1,col2),(col1,col2,col3) 组合可以用到索引,(col2),(col2,col3) 不会用到索引,因为不符合最左原则
4. 聚合函数 min max 5. 排序 order by,分组 group by

覆盖索引(covering index):索引覆盖了全部查询字段,不需要获取具体数据行,直接通过索引字段即可获取全部需要数据

mysql 索引结构

大多数MySQL索引保存在 B-trees 结构里,比如:PRIMARY KEY, UNIQUE, INDEX, 和 FULLTEXT,InnDB 对于 FULLTEXT 全文索引还会同时使用倒排索引

B-trees Balance Trees 平衡树

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_b_tree
B-tree:一种数据库常用索引,它随时让数据保持有序,能够快速精准查找(= 操作)和范围查找((for example, greater than, less than, and BETWEEN operators),这种索引可以在大部分存储引擎使用,比如:InnoDB、MyISAM

hash indexes 哈希索引

哈希索引将条目位置保存在内存中,当有查询时直接读取内存值,直接定位 mysql 分区-页-直指数据位置
哈希索引仅用于内存存储引擎(MEMORY storage engine)

R-trees

R树是B树 向多维空间发展的另一种形式,它将对象空间按范围划分,每个结点都对应一个区域和一个磁盘页,非叶结点的磁盘页中存储其所有子结点的区域范围,非叶结点的 所有子结点的区域都落在它的区域范围之内;叶结点的磁盘页中存储其区域范围之内的所有空间对象的外接矩形。R树是一种动态索引结构

主键

唯一键

普通索引

重复度高的字段不适合建索引,比如 status

复合索引

最左原则

事务

共享锁:读读正常,读写互斥,写写互斥
排它锁:所有操作互斥

锁升级

主键、唯一键为行锁,普通索引如果离散程度能够接近唯一也会触发行锁,未使用索引一定会触发表锁,低效索引(比如where中有重复性高的字段)会触发表锁


阅读:21
搜索
  • Linux 高性能网络编程库 Libevent 简介和示例 1887
  • Mac系统编译PHP7【20190929更新】 1732
  • Windows 安装Swoole 1543
  • Hadoop 高可用集群搭建 (Hadoop HA) 1426
  • Hadoop 高可用YARN 配置 1347
  • 小白鼠问题 1269
  • Hadoop Map Reduce 案例:好友推荐 1226
  • 自动化测试工具 Selenium 1090
  • GIT 分支管理 1007
  • 一致性哈希算法说明及PHP示例 961
简介
不定期分享软件开发经验,生活经验