高性能MYSQL(三)

2017-07-10  本文已影响0人  walker_liu_fei

MYSQL 只能高效利用最左前缀索引, 对于不同的存储引擎,索引的实现也是不同的

BTree 索引

全文索引

全文索引是一种特殊类型的索引,它查找的是文本中的关键词而不是直接比较索引中的值
全文索引适用的场景,有点类似于搜索引擎

索引的优点

  1. 索引三星评价
    评价索引是否适合某查询

第一星
索引将相关data行放到一起

第二星
索引的data行按查询所需顺序排序

第三星
索引含 查询全部列

索引的缺陷

索引策略

将索引列单独放在比较符号的一侧

多列索引

多列索引又叫联合索引,不用于多个列的单独索引,多列索引能够很好的适用于类似

select * from auction where auction_id = "xxx" or auction_name  =  "xxx" 

这样的查询。

如果是两个单独索引的话,这样的查询会直接走全表的查询,两个单独的索引排不上用场,除非查询改成

select * from auction where acution_id  = "xx" unoin all select * from auction where auction where auciton_name = "xxx" and auction_id != "xxx"

聚簇索引

聚簇索引中,索引树的叶级页包含实际的数据:记录的索引顺序与物理顺序相同。在非聚簇索引中,叶级页指向表中的记录:记录的物理顺序与逻辑顺序没有必然的联系。
一般来说,DBMS都会以聚簇索引的形式来存储实际的数据,它是其它二级索引的基础。

覆盖索引

InnoDB的二级索引的叶子节点都包含了主键的值,这意味着InnoDB的二级索引可以有效的利用这些额外的主键来覆盖查询

使用索引扫描来做排序

mysql 的排序

使用条件:

  1. 查询的WHERE子句和ORDER BY子句中查询的字段在同一颗索引树上,
  2. ORDER BY 字段的顺序是跟建立索引的顺序是一致的。
  3. 查询的字段也在同一颗索引树
    以上三个条件必须同时满足

2.filesort 文件排序
原理:这里的文件排序并不是字面那表示的意思,利用了磁盘IO来进行排序,不过是优化器告诉你,进行了一个排序操作,具体排序的地方还是内存,相对应的参数是sort_buffer_size 设定的大小

  1. filesort不一定会产生临时表
  2. filesort 与临时表数据写入磁盘是没有任何直接联系

只有当索引的列顺序和ORDER BY 子句的顺序完全一致,并且所有列的排序方向都一样时,MYSQL才能够使用索引来对结果排序。

如果查询需要关联多张表,则只有当ORDER BY子句引用的字段全部为第一个表是,才能使用索引做排序。

ORDER BY 和WHERE 子句一样都是需要满足索引最左前缀的要求,即,第一个条件需要时索引列

不能用索引排序的查询:

索引和锁

InnoDB 只有在访问行的时才会对其加锁(行级锁),而索引能够减少InnoDB访问的次数,从而减少锁的数量

InnoDB在二级索引上是使用共享(读)锁,但访问主键索引需要排它(写)锁,这消除了使用覆盖索引的可能性,并且,使得SELECT FOR UPDATE 比LOCK IN SHARE MODE 或费锁定查询要慢许多

案例与总结

考虑表上所有的选项,当设计索引时,不要只为现有的查询考虑需要的那些索引,还需要考虑对查询进行优化,如果发现某些查询需要创建新索引,但是这个索引会降低另一些查询的效率,那么应该想一想是否能优化原来的查询。

避免多个范围的查询

duib

MYSQL松散索引扫描

参考: MySQL松散索引扫描与紧凑索引扫描

维护索引和表

维护表的三个目的: 找到并修复损坏的表,维护准确的索引统计信息,减少碎片
InooDB通过抽样的方式来计算统计信息,首先随机的读取少量的索引页面,然后一起为样本计算索引的统计信息。可以通过innodb_stats_sample_pages 来设置样本页的数量。设置的值更大,理论上来说可以帮助生成更准确的索引信息

Btree需要随机磁盘访问才能定位到叶子页,所以随机访问是不可避免的,如果叶子节点在物理分布上是顺序而且紧密的,那么查询的性能就会变得更好。
对于表的数据存储来说,数据存的碎片化有三种类型

结论

在选择索引和编写利用这些索引时,有如下的三个原则:

上一篇下一篇

猜你喜欢

热点阅读