mysql 优化

 

 

 

join代替子查询,join也尽量少用

join用小的结果集驱动大的结果集,第二个表要建索引,

mysql会用第一张表的每条数据去第二张表中查找

 

尽量定义成not null,并设置默认值

只有一行数据满足条件,要使用limit 1,找到后就停止

列不要太多,指定需要的列,避免select *

in代替or,in是排序的,复杂度O(lgn),数据是连续的话,用between代替in

 

当不存在重复数据时,用union all 代替 union,union会排序并去重

不要使用order by rand()

 

myisam里会记录表的行数,innoDB不会记录,count(*)会比较慢,可以单独用一张表记录行数

 

where 尽量用相同的类型,避免隐式转换

不用外键和unique,由程序保证约束

尽量不要用字符串做主键

 

分页:select * from t where ... limit 100000,20 会很慢,需要回表100020次,然后丢弃前100000行

可以 select a.* from t a, (select id from t where ... limit 100000, 20) b where a.id=b.id

只需回表20次

 

大量导入数据时,先禁用索引和约束,导入完了再一次性创建索引,

innoDB会为每条语句创建事务,比较耗时,可以先手动开启事务,批量导入,然后提交事务

若格式相同,可以预编译

 

大量删除数据,可以先删除索引,再删数据,然后创建索引

 

 

min()、max()在索引上是常数时间

 

posted @ 2020-05-27 20:05  是的哟  阅读(109)  评论(0)    收藏  举报