SQL
可能的原因无索引或者索引失效
锁等待
不恰当的SQL
语句
select *
操作一般都需要回表,除非where
条件是主键。在大数据表中使用<LIMIT M,N>
分页查询。
思路:利用子查询优化分页查询
select * from order where id > (select id from order order by order_no limit 10000,1) limit 20
select
案例MySQL Innodb默认创建主键时会创建主键索引,而主键索引属于聚簇索引,即在存储数据时,索引是基于B+,构成的,
而叶子节点存放的是数据。
假设存在order_no、status俩列联合索引,现在要查出order_no、status俩列的值,通常我们都是这
样子干的:
select * from order where order_no='xxx' #效率低
select order_no、status from order where order_no='xxx' #正确
为什么*会效率低呢?因为order_no、status是联合索引,定位到这个索引并不包含这行所有的数据,此时
就需要通过主键索引回表去查找整行的数据了,注意回表。
select count(*)
优化方案
MYISAM
会有一个变量记录具体行数,但如果加了条件,InnoDB和
和MYISAM
都一样,得老老实实去查,所以下面讨论的都是日常使用最多的InnoDB
。
explain
,它不会真正去执行,只会返回个大概的值。思考题