1. 尽可能使用中间变量来开启查询缓存
// 查询缓存不开启
$r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");
// 开启查询缓存
$today = date("Y-m-d");
$r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");
2. EXPLAIN 你的 SELECT 查询
3. 取一条数据时加上limit 1、select 你想要的字段,最好不要用
在用sqlalchemy取数据时一般都会用到TableClass.query.filter. first() ,这将会翻译为limit 1
发现目前项目里大部分代码在取数据时都是 TableClass.query.filter.all() / first() , 翻译为 select * from Tableclass where field=xx
建议用with_entities来获取想要的字段而不是获取全部字段。
4. 根据业务建立适合的组合索引
User表 (key, name, city, age, .....)
select key from user where name='xxx' and city ='广州' and age = 25
ALTER TABLE user ADD INDEX name_city_age (name, City, Age);
建立这样的组合索引,其实是相当于分别建立了 (最左前缀匹配原则)
name
name, city
name, city, age
处理千万级数据查询分页
Mysql的优化是非常重要的。其他最常用也最需要优化的就是limit。Mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。
同样是取10条数据
select * from big_table limit 90000,10 =8秒
和
select * from big_table limit 100,10 =0.01秒
不是一个数量级别。
当offset 较小的时候直接limit, 如果offset 比较大的时候:
Select * From big_table Where vid >=(
Select id From big_table Order By id limit 90000,1 = 0.19秒
) limit 10
```