1 覆盖索引
查询中使用的索引包含了结果集需要的字段,因此少了回表的操作,加快了查询效率;
简单的说就是,二级索引中的索引值+主键
,刚好包含了select选中的列。
# 使用了索引覆盖
CREATE INDEX idx_course_id(course_id) ON student_info
SELECT st.course_id FROM student_info st WHERE st.course_id > 1000
# 未使用到索引覆盖
SELECT st.course_id,st.NAME FROM student_info st WHERE st.course_id > 1000
覆盖索引的好处
1 避免了通过二级索引查询后还要去聚簇索引回表的操作;
2 可以吧随机IO变成顺序IO加快查询效率;
2 索引下推
如果没有索引下推,二级索引匹配后需要定位到基表的行,然后再进行筛选,有了索引下推之后,where中的条件使用索引就能进行筛选。
#使用索引下推的情况
CREATE INDEX idx_course_name ON student_info (course_id,NAME)
EXPLAIN SELECT course_id FROM student_info WHERE course_id>1000 AND NAME LIKE '%ao%'
3 数据库常用优化方案
3.1 数据表结构优化
1 冷热数据分离
减少表的宽度,减少磁盘IO,提高缓存的利用率;
2 增加中间表
将原本需要联合查询的表的数据构建为中间表,减少join操作,但是这种措施数据一致性需要保证;
3 增加冗余字段
4 优化数据类型
优先选择符合存储字段最小的数据类型(非负的整数加:UNSIGNED
)
浮点数据类型用DECIMAL
5 尽量使用非空约束
3.2 大表优化
1 限定查询的范围
禁止不带任何限制数据范围条件查询语句
2 读写分离
通过MySQL主从复制,进行读写分离
3 垂直拆分
垂直分库与垂直分表
4 水平拆分
把一张表的数据拆成几份,比如按照时间分。。等等。。分片规则
3.3 其它调优策略
1 服务器语句超时处理
2 创建全局通用表空间