数据库优化

45 阅读2分钟

数据库优化

在初期设计和运行期间筛选热门属性分离,另外根据数据量和表的字段,做好分库分表,分泄压力

关于索引:

创建索引须知:

1、单表索引不超过5个

2、联合索引的字段不超过5个

3、经常增删改的字段不适合创建索引

4、枚举值字段不适合创建索引

5、不经常修改,经常查询的字段适合创建索引

6、大长度的字段,可以设置前缀索引(为字段的前几个字符建立索引)

主键索引和非主键索引

依托于INNODB数据库引擎:

数据库的存储结构为B+树,表一定需要主键; 如果不创建,数据库会自动创建并维护一个主键索引, 存储于树的非叶子节点(第二层节点) ,叶子节点则存储行数据
数据库系统通过主键可以直接在索引树上找到数据,不需要查表,速度非常快

非主键索引

普通索引[idx_列名]

唯一索引[uk_列名]

联合索引[idx_列1_列2]

全文索引(非常用)

查询优化

执行的最终原则:尽量让SQL命中索引,提升查询性能

最左前缀法则【模糊搜索和联合索引】

联合索引由多个列组成----在使用联合索引时,必须满足从左边开始匹配索引列,在写查询条件时,应该从联合索引的最左列开始依次编写

增加命中率

考虑存在索引失效的情况,需要使用Explain语句查询信息分析命中效果

主要分析字段如下:

type :

遵循一个原则,尽量触发前面的,一般尽量到range,最好保证在ref

key : 实际命中的索引


key_len ; key_len 计算规则 合适的计算长度可以表明命中率.

extra: 扩展信息 ===>Using index:触发了覆盖索引

优化规则

1、尽量命中索引

2、使用联合索引时遵循最左前缀法则

3、避免索引失效的情况

4、分页查询优化 避免深度分页 滚动id查询

5、避免回表 --当查询未命中索引,就会出发回表操作,这样会耗费时间,绕过缓存直接去查询库数据,当数据量过大则肯可能严重影响性能,甚至宕机

  • 解决方案: 使用覆盖索引-->覆盖索引:查询的字段是索引列
  • 系统的自带解决方案: 索引下推