1. 如何做SQL优化
1.1 定位慢SQL
开启慢查询
slow_query_log = 1
long_query_time = x(s)
1.2 优化
1.2.1 查询优化
指定具体列代替*
1.2.2 索引优化
使用explain查看执行情况, 查看索引是否生效
利用覆盖索引
1.2.3 join优化
避免多表join
小表驱动大表, 因为小表会被遍历连接大表, 为了减少连接次数
增加冗余字段
分页优化
limit id
延迟关联
跳转链接
2. explain中各个字段代表什么
id: 每个select语句都会分配一个id
select_type: 查询类型
table: 查询的表
possible_keys: 可能用的索引
key: 实际用到的索引
key_len: 索引长度
rows: 估算要读取的行数
extra: Using index(代表使用了覆盖索引), Using where(表示在存储引擎中筛选了数据), Using temporary(使用了临时表)
type:
- system, const: 非常快, 是唯一索引的常量 等值 查询
- eq_ref: 联表查询使用唯一索引
- ref: 非唯一索引单表或联表
- ref_or_null: 类似ref, 可以搜索值为null的行
- range: 索引使用了范围查询(> < between, in...)
- index: 遍历了索引树
- all: 全表扫描
3. 创建索引需要注意哪些
不能过多, 因为维护索引需要占用存储空间
经常变化的列不能创建索引, 因为会导致索引结构的变化
多条件查询可以创建联合索引
无序的列尽量不创建索引, 因为会导致页分裂, 页合并
4. 索引失效
最左匹配
索引列的运算
!=
< > 之后的列
%在前
字符串不加单引号
order by group by
5. 为什用B+不用B
B+数据存在叶子节点中, 每一层能存更多的节点和指针
B+的叶子节点是链表形式的, 更好的范围查询和排序
6. Hash索引和B+的区别
B+支持范围查询, hash不支持
B+支持排序, hash不支持
B+支持模糊查询, hash不支持
hash等值查询效率高