1.索引是什么:索引(Index)是帮助MYSQL高效获取数据的数据结构。本质数据结构排序+查找
一般来说索引本身也很大,不可能全部存储的内存中,因此索引往往以索引文件的形式存储在磁盘上。我们平时所说的索引,如果没有特别指明,都是指B树(多路搜索树,并不一定是二叉树)结构组织的索引。
解决sql的where条件后面的字段是否查得快,条件的封装组合,以及orderby排序的查询;
原理如图:
为了加快查找col2,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应的数据,从而快速的检索出符合条件的记录。
索引详解:在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
2.索引的优势:
2.1.提高数据检索的效率;
2.2.降低数据排序的成本。
3.索引劣势:
3.1 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的;
3.2 虽然索引大大提高了查询的速度,同时却也会降低更新表的速度,如对表进行INSERT,UPDATE,和DELETE。因为更新表 时,MYSQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引的字段,都会调整呢个因为更新所带来的键值变 化后的索引信息
3.2 索引只是提高效率的一个因素,如果你的MYSQL有大数据的表,就需要花时间研究建立最优秀的索引,或优化查询 sql。
4.索引分类:(一张表建立的索引最好不超过五个,mysql一般是BTree索引)。4.1. 单值索引:即一个索引只包含单个列,一个表可以有多个单列索引;
4.2. 唯一索引:索引列的值必须唯一,但允许有空值;
4.3. 复合索引:即一个索引包含多个列。
基本语法:创建:CREATE [UNIQUE] INDEX indexName ONmytable(columname(length));
删除:DROP INDEX [indexName] ON mytable;
查看:SHOW INDEX FROM table_name\G;
5.检索原理:
初始化介绍:
一颗b+树,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(浅蓝色所示)和指针(黄色所示),
如磁盘块1包含数据项17和35,包含指针P1,P2,P3,
P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。
真实的数据存在于叶子节点即3,5,9,10,13,15,28,29,36,60,75,79,90,99.
非叶子节点只不存储真实数据,只存储指引索引方向的数据项,如17,35并不真实存在于数据表中。
查找过程:
如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35 之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。
6.适合建立索引的情况:
6.1. 主键自动建立唯一索引;
6.2. 频繁作为查询条件的字段应该创建索引;
6.3. 查询中与其他表关联的字段,外键关系建立索引;
6.4. 频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录还会更新索引;
6.5. Where条件里用不到的字段不创建索引;
6.6. 单键/组合索引的选择问题,如何选择?(在高并发下倾向创建组合索引)
6.7. 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度;
6.8. 查询中统计或者分组字段。
频繁作为查询条件的字段:eg:银行卡号,微信号,电信系统的手机号等。
7.哪些情况不适合建立索引:
7.1.表记录太少
7.2.经常增删改的表:因为提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT,UPDATE,DELETE。因为更新 表时候,MYSQL不仅要保存数据,还要保存一下索引文件。
7.3. 注意,如果某个数据列包含许多重复的内容,为它建立索引没有太大的意义。
8.MySql查询性能分析:
8.1Mysql中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息为客户请求的 Query 提供他认为最优秀的执行计划;
8.2当客户端向Mysql请求一条Query,命令解析器模块完成请求分类,区别出是SELEC并转发给Mysql Query Optimizer(MySQL查询优化器) 时,Mysql Query Optimizer首先会对整条Query进行优化,处理掉一些常量表达式的预算,直接换算成常量值。并对Query中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调整等。然后分析Query中的Hint信息(如果有),看显示Hint信息是否可以完全确定该Query的执行计划。如果没有Hint或者Hint信息还不足以完全确定执行计划,则会读取所涉对象的统计信息,根据Query进行写相应的计算分析,然后再得到最后的执行计划。
9. Mysql常见瓶颈:9.1 CPU:CPU在饱和的时候一般发生在数据装入内存或者从磁盘上读取数据的时候;
9.2IO:磁盘IO瓶颈发生在装入数据远大于内存容量的时候;
9.3 服务器硬件的性能瓶颈:top,free,iostat和vmstat来查看系统的性能状态。