前提:公司系统库和报表库不是同一个,报表在备库上
这里我主要介绍我们公司用的最多的非聚集索引
通常我建索引的方式,不要觉得low,只要目的达到就成,不需要装那个比
部署到正式库,这个地方有sql
索引类型
Normal:普通索引:最基本的索引,它没有任何限制,可以单个或者多个字段
Unique:唯一索引:与普通索引类似,不同的就是索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
Full Text:全文索引:基本不用就不介绍了,介绍也是百度的,没意义
索引方式
B-Tree
B-tree索引应用:=, >, >=, <, <=, 及 BETWEEN,对比值为常量且不以通配符起始的LIKE
Hash 索引特点
只能等值或者不等值匹配(= 或 <=> )但很快。使用此类查询的应用一般称之为key-value 存储。
无法使用HASH索引优化ORDER BY 操作。(这种类型的索引无法用于查询排序)
MySQL无法通过此索引估计范围条件间的数据行(优化器对于范围查询的优化(选择索引))。
只能使用全部的健来匹配查询(区别于B-tree 类型索引的最左前缀原则)
优化:
- 前模糊查询不能使用索引,后可以
- 负向条件查询不能使用索引,可以优化为 in 查询。
负向条件有:!=、<>、not in、not exists、not like 等
3.联合索引最左前缀原则(又叫最左侧查询)
如果在(a,b,c,d)三个字段上建立联合索引,那么它能够加快 a | (a,b) | (a,b,c) | (a,b,c,d) 四组查询速度。
4.组合索引是,区分度越高越放在前面,比如订单号应该放在组合索引最前面
5.范围列可以用到索引(联合索引必须是最左前缀)。
范围条件有:<、<=、>、>=、between等。
下图的这个ORDER_TYPE用不到索引
6.把计算放到业务层而不是数据库层。
这样是用不到索引的
这样可以
7.不要强制转化类型,下面REMARK是varchar就不能命中索引
- 更新十分频繁、数据区分度不高的字段上不宜建立索引
如订单类型,状态 - 业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。
唯一索引的效率明显高很多,但是我接触的项目建唯一索引的还是少
10.多表join,连接字段要有索引
最好不要超多三张表关联,如果是做报表需要,就弄个聚合表,让领导查看起来速度快一点 - 如果明确知道只有一条结果返回,limit 1 能够提高效率。
其实这个不用说,肯定是你告诉数据库条件越多,他找到的数据越快,就跟送快递填写地址一样
12
2.尽量指定索引,当同一个字段出现多个索引,尽量指定高效的索引,mysql优化器会计算出一个合适的索引,但是这个索引不一定是最好的
注:不要随便建索引,有些索引不仅没有优化查询效率,还降低了数据库性能
还有单表超过1000W就分表吧