数据库优化
在初期设计和运行期间筛选热门属性分离,另外根据数据量和表的字段,做好分库分表,分泄压力
关于索引:
创建索引须知:
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、避免回表 --当查询未命中索引,就会出发回表操作,这样会耗费时间,绕过缓存直接去查询库数据,当数据量过大则肯可能严重影响性能,甚至宕机
- 解决方案: 使用覆盖索引-->覆盖索引:查询的字段是索引列
- 系统的自带解决方案: 索引下推