1.尽量踩聚簇索引,减少回表的可能。
2.在where和order by 列上加索引
3.减少where 字段值null判断
SELECT * FROM m_user where type = null
改为:
SELECT * FROM m_user where type = 0
4.应尽量避免在 where 子句中使用!=或<>操作符
5.应尽量避免在 where 子句中使用 or 来连接条件
SELECT * FROM "tb_real_time_car" where pay_status != null or enter_time = null;
改为:union连表操作
SELECT * FROM "tb_real_time_car" where pay_status != null union all SELECT * FROM "tb_real_time_car" where enter_time = null;
6.in 和 not in 也要慎用
SELECT * FROM "tb_real_time_car" where rowed in [1,2,3,4];
改为:
SELECT * FROM "tb_real_time_car" where rowed between 1 and 5;
7.少使用模糊匹配 like
8.应尽量避免在 where 子句中对字段进行表达式操作
SELECT * FROM "tb_real_time_car" where rowid/4 =100;
改为:
SELECT * FROM "tb_real_time_car" where rowid =4*100;
9.不要在条件判断时进行算数运算
10.很多时候用 exists代替 in 是一个好的选择
SELECT * FROM "tb_real_time_car" where rowed in (select rowed from "tb_real");
改为:
替换为SELECT * FROM "tb_real_time_car" where exists (select rowed from "tb_real" where rowed = tb_real.rowid)
11.尽量使用前戳索引
字符串类型,截取前面字符串长度为索引
12.使用索引扫描进行排序
13.union all,in,or都能够使用索引,但是推荐使用in
14.强制类型转换会全表扫描
15.尽量不允许为空,默认值0,或者其他
16.能使用limitd的时候尽量使用limit
17.单表索引建议控制在5个以内
18.单索引字段数不允许超过5个(组合索引)
19.不要过早优化,在不了解系统的情况下进行优化
explain查询是否踩索引
expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra
概要描述:
id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明