不使用负向查询,如not in/like
- 无法使用索引,导致全表扫描
- 全表扫描导致buffer pool利用率降低
- 让数据库做最擅长的事
- 降低业务耦合度,为sacle out、sharding留有余地
- 避开BUG
- MySQL最擅长的是单表的主键/二级索引查询
- JOIN消耗较多内存,产生临时表
- MySQL不擅长数学运算和逻辑判断
- 无法使用索引
- INSERT … ON DUPLICATE KEY UPDATE
- REPLACE INTO、INSERT IGNORE 、INSERT INTO VALUES(),(),()
- UPDATE … WHERE ID IN(10,20,50,…)
如何正确的使用分页?假如有类似下面分页语句:SELECT * FROM table ORDER BY id LIMIT 10000, 10 由于MySQL里对LIMIT OFFSET的处理方式是取出OFFSET+LIMIT的所有数据,然后去掉OFFSET,返回底部的LIMIT 。所以,在OFFSET数值较大时,MySQL的查询性能会非常低 。可以使用id > n 的方式进行解决:
使用id > n 的方式有局限性,对于id不连续的问题,可以通过翻页的时候同时传入最后一个id方式来解决 。
http://example.com/page.php?last=100select * from table where id<100 order by id desc limit 10//上一页http://example.com/page.php?first=110select * from table where id>110 order by id desc limit 10
这种方式比较大的缺点是,如果在浏览中有插入/删除操作,翻页不会更新,而总页数可能仍然是根据新的count(*) 来计算,最终可能会产生某些记录访问不到 。为了修补这个问题,可以继续引入当前页码以及在上次翻页以后是否有插入/删除等影响总记录数的操作并进行缓存select * from table where id >= (select id from table order by id limit #offset#, 1)
- 拒绝大SQL,拆分成小SQL
- 充分利用QUERY CACHE
- 充分利用多核CPU
- 使用in代替or,in的值不超过1000个
- 禁止使用order by rand()
- 使用EXPLAIN诊断,避免生成临时表
- 用union all而不是union
union和union all关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同 。
union在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果 。如:
select * from test_union1union select * from test_union2
这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序 。而union all只是简单的将两个结果合并后就返回 。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了 。
从效率上说,union all要比union快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用union all,如下:
select * from test_union1 union all select * from test_union2
- 程序应有捕获SQL异常的处理机制
- 禁止单条SQL语句同时更新多个表
- 不使用select * ,SELECT语句只获取需要的字段
- 消耗CPU和IO、消耗网络带宽
- 无法使用覆盖索引
- 减少表结构变更带来的影响
- 因为大,select/join 可能生成临时表
- UPDATE、DELETE语句不使用LIMIT
- INSERT语句必须显式的指明字段名称,不使用INSERT INTO table()
- INSERT语句使用batch提交(INSERT INTO table VALUES(),(),()……),values的个数不超过500
- 统计表中记录数时使用COUNT(*),而不是COUNT(primary_key)和COUNT(1) 备注:仅针对Myisam
- 数据更新建议使用二级索引先查询出主键,再根据主键进行数据更新
- 禁止使用跨库查询
- 禁止使用子查询,建议将子查询转换成关联查询
- 针对varchar类型字段的程序处理,请验证用户输入,不要超出其预设的长度;
推荐阅读
- 靠接外包的程序员,能生活的下去吗
- 「PHP编程」为什么使用composer下载的包,不需要再include?
- 下雪的季节 注意事项
- 淘宝卖家动态评分为什么会自动下降 淘宝动态评分一直下降
- |玩和田玉的人最好不要有这种心理,你知道原因吗?一起来探讨下
- 高端茶价格纷纷下挫,礼品茶难销平民茶走俏
- RSS|在流量大厂的围攻下 有人希望20多岁老掉牙的技术复活
- 男性春季养生调养身体的方法
- 淘宝拍下付款后怎么取消订单 淘宝拍卖可以取消订单吗
- 电力公司桌游玩法简介