【转】关于sql的书写
先提提大原则
1)优化更需要的优化 说明:执行对系统影响更大的QUERY,一般指的是高并发,执行更加频繁的SQL)
2)定位优化对象性能瓶颈
3)明确优化目标
4)explain 写sql语句必须要使用explain
5)profile
6)小结果集驱动大结果集
7)尽可能在索引中完成排序
8)只取自己需要的字段
9)仅仅使用最有效的过滤条件
10)尽可能避免复杂的JOIN和子查询
说说我们自己的小规定:
一条sql语句能搞死一个数据库,继而搞死整站 !!
1.索引以idx开始+组成索引字段命名,如 idxusertype (userid, type)
2.innodb都需要有一个主键
3.联合索引最前缀原则 select * from table where a=? and b=? and c=?
4.相似性高的不要建联合索引如appkey 直接where gid=xx order by mgsid;
5.别忘了order by createtime;加索引或联合索引,这种一般是后来产品要求的。
6.别走count了,走计数器。
7.严禁foreach sql
8.越简单越好,多查几次都行。
9.索引数不宜过多.5000千万数据,一个索引可能增加5个G存储空间。
一个上亿表加个索引得加一下午甚至一天。
10.复杂的表查询从产品层面解决
11. 又排序又取计数。 双写。采取双写,读计数时走计数器,读排序时走order by 联合索引。
12.一个页面一次请求sql语句复杂的不超过10个,简单的不超过5个。第二次再减半
13.灵活运用索引。如order by createtime没有索引时用order by id代替
14.in 语句不能过多,不能超过50个。
15.杜绝用SQLCALCFOUNDROWS,left join,group by 等
16.程序中杜绝order by 一个变量及变量中传值再组装 一个方法一个sql语句,不要千变万化,衍生出多个
17.不要用函数
19.取in的排序用php程序排,不要findin_set
20.order by 走不上索引的走搜索.数据表结构不满足的走搜索或统计
22.delete,update也要有索引
23.limit值单独处理,作限制。不要 limit 1000万,5;