1.如果只是用来判断指定条件的数据是否存在,用select 1 from table where id = 1 比 select * from table where id = 1刚快.
2.小表驱动大表.查询用户id为1的大数据量订单时,可以用in,in和exists的区别,in里面先执行,然后再执行其他语句,可以在in里面是小表,exists是先执行左边,再执行右边,可以左边是小表.注意,in里面元素不宜过多.
3.批量添加的时候,for循环里面一个个添加效率低,和数据库连接开销大,最好执行批量添加,batchInsert,
insert into order(id,code,user_id)
values(123,'001',100),(124,'002',100),(125,'003',101);
但是,这种插入和数量也是有线性关系,建议不超过500,如果超过的话,分批次操作.
4.合理使用limit,比如查询某人的第一次下单时间,不需要先查询出列表,然后再取第一个,可以直接sql后面加limit,或者查询单条数据的时候,防止有重复数据,也可以limit,
5.尽量用连接查询代替子查询,子查询会创建临时表,查询完成之后删除临时表,也会消耗资源.如果业务匹配,用inner join 替代left join .如果两张表使用inner join关联,mysql会自动选择两张表中的小表,去驱动大表,left join是用左边的表驱动右边的表,这里注意最好左边是小表.
6.选择创建索引时,选择离散度较高的列作为索引,id总比gender更适合做索引,区分度高.
select count(distinct id) / count(*) from user;
这个值越接近1越适合做索引
7.一个table中索引数量不宜过多,最好5个以内,不然创建数据的时候创建索引也会占用内存和空间,灵活创建索引,联合索引.
8.sql执行的时候要注意什么情况下没走索引.
9.合理选择字段类型.
能用数字类型,就不用字符串,因为字符的处理往往比数字要慢。
尽可能使用小的类型,比如:用bit存布尔值,用tinyint存枚举值等。
长度固定的字符串字段,用char类型。
长度可变的字符串字段,用varchar类型。
金额字段用decimal,避免精度丢失问题。
10.避免select * ,只查询你想要的字段.
11.不必严格符合数据库第三范式,可以创建一些冗余的字段,来避免多表查询.
12.灵活使用group by ,尽量缩小数据范围.