当前位置: 首页 > 科技观察

阿里制定了11项强制性索引创建规范以提高性能

时间:2023-03-22 17:15:35 科技观察

1。【强制】业务中具有唯一性的字段,即使是多个字段的组合,也必须建立唯一性索引。注意:不要认为唯一索引会影响插入速度。这个速度损失可以忽略不计,但是对搜索速度的提升是很明显的。另外,即使在应用层做了很完善的校验控制,只要没有唯一索引,根据墨菲定律,就一定会产生脏数据。2、【强制】超过三张表禁止加入。需要连接的字段的数据类型必须绝对一致;多表关联查询时,保证关联字段需要有索引。注意:即使连接两个表,也要注意表索引和SQL性能。3.【强制】对varchar字段创建索引时,必须指定索引长度。不需要为所有字段都创建索引,索引长度可以根据实际的文本判别来确定。注:索引的长度和判别是一对矛盾。一般对于字符串类型的数据,长度为20的索引会有90%以上的判别率。您可以使用count(distinctleft(columnname,indexlength))/count(*)来确定区分程度。4.【强制】严禁搜索左模糊或全模糊的页面。如有需要,请使用搜索引擎解决。解释:索引文件具有B-Tree的最左前缀匹配特性。如果左边的值不确定,则不能使用该索引。5.【建议】如果有按场景排序的,请注意索引的有序性。orderby***字段是复合索引的一部分,放在索引复合序列的最前面,避免file_sort影响查询性能。正例:a=?和b=?按c订购;索引:a_b_c反例:索引中存在范围搜索,则不能使用索引顺序,如:WHEREa>10ORDERBYb;无法对索引a_b进行排序。6、【建议】使用覆盖索引进行查询操作,避免返表。解释:如果一本书需要知道第11章的标题是什么,是否会打开第11章对应的页面?随便浏览一下目录,这个目录就是起到覆盖索引的作用。正例:可以建立的索引类型分为三种:主键索引、唯一索引、普通索引。覆盖索引只是一个查询的结果。在解释的结果中,会出现额外的列:usingindex。7、【推荐】使用延迟关联或子查询优化超多分页场景。解释:MySQL并没有跳过offset行,而是取offset+N行,然后返回放弃前的offset行,返回N行。当偏移量很大时,效率很低,或者控制返回的总页数,或者对超过特定阈值的页数执行SQL重写。正例:先快速定位到需要获取的id段,然后关联:SELECTa.*FROMtable1a,(selectidfromtable1whereconditionLIMIT100000,20)bwherea.id=b.id8.【推荐】SQL性能优化的目标:至少达到range级别,要求是ref级别,如果可以consts***。注意:1)consts单表最多只有一个匹配行(主键或唯一索引),优化阶段可以读取数据。2)ref指的是使用普通索引(normalindex)。3)range对索引进行范围检索。反例:explaintable的结果,type=index,对索引物理文件进行全扫描,速度很慢,索引级别低于范围,跟全表扫描比起来算不了什么。9.【建议】在构建综合指标时,区分度最高的应该放在最左边。注意:当非等号和等号混合存在时,建索引时请在前面加上等号条件的列。例如:wherec>?和d=?那么即使c的判别度更高,d也必须放在索引的最前面,即索引idx_d_c。正例:ifwherea=?和b=?,如果a列几乎唯一,只需要建立idx_a索引即可。10、【建议】防止字段类型不同导致的隐式转换导致索引失败。11、【参考】创建索引时要避免以下极端的误区:1)多不如少。认为查询需要建立索引。2)宁可短,不可乱。人们认为索引会消耗空间并严重减慢更新和添加速度。3)抵制唯一索引。认为业务的唯一性需要在应用层通过“先检查后插入”的方式来解决。