您的当前位置:首页正文

mysql 军规_在互联网大厂必须遵守的MySql开发军规

2024-11-08 来源:个人技术集锦

SQL语句尽可能简单,因为一条SQL只能在一个CPU运算,在高并发的情况下,可能一条大SQL就把整个数据库堵死。而简单的SQL缓存命中率更高,减少锁表的时间(特别是MyISAM),用上多CPU

保持事务、DB连接足够短,即开即用、用完就关。与事务无关操作放到事务外面,减少锁资源的占用;在不破坏一致性前提下,使用多个短事务代替长事务(如:发帖时的图片上传等待)

尽可能少用存储过程,少用触发器,减用MySQL函数对结果进行处理(交由客户端程序负责)

尽量少用select *,只取需要数据列,为使用覆盖索引提供可能性,减少临时表生成,更安全

用in()代替or,因为or的效率是O(n),而in()的效率是O(Log n)。如:where a = 1 OR a = 100 与 where a IN (1, 100)

merge index往往很弱智,所以用union代替对多字段的or查询。如:select * from t where a = 1 OR b = 2 与 select * from t where a = 1 UNION select * from t where b = 2

尽量避免负向查找,如NOT、!=等

尽量避免%前缀模糊查询,由于使用的是B+ Tree,前缀模糊使用不了索引,导致全表扫描(后缀模糊速度相对快很多)

减少COUNT(*),使用COUNT(col),前者资源开销大,尽量少用。MyISAM不带WHERE COUNT()而INNODB带WHERE COUNT()。 计数的统计可以采用的方法:实时统计可以使用memcache,双向更新,凌晨跑基准;非实时统计尽量用单独统计表,定期重算

LIMIT高效分页:传统的方法是select * from t limit 10000, 10,推荐的方法是select * from t where id > 23423 limit 10。LIMIT的偏移量越大则越慢。还有一些高效的方法有:先取id来LIMIT偏移,减少整体的数据偏移;取到需要的id,与原表JOIN;程序取ID,然后用IN来填写。select * from t where id >= (select id from t limit 10000, 1) limit 10 , select * from t INNER JOIN (select id from t limit 10000, 10) USING (id) , select id from t limit 10000, 10; select * from t where id in (123, 456...)

若无需对结果进行去重,则用UNION ALL而非UNION(UNION有去重开销)

分解JOIN联接来保证高并发。高并发DB不建议进行两个表以上的JOIN

group by会默认自动升序排序,如果需要去掉排序,需要指定order by NULL

比较原则:数字对数字、字符对字符。如果数值列与字符类型作比较,同时转换成双精度;如果字符列与数值类型作比较,字符列整列转数值,且不会使用索引查询

load data导入数据比insert快约20倍(不需要刷新缓存)

尽量不使用insert...select(延迟、同步出错)

大批量更新凌晨操作,避开高峰

SQL的一些命令:explain, show profile, mysqlsla, mysqldumpslow, show slow log, show processlist, show QUERY_RESPONSE_TIME(Percona)

Top