mysql的使用习惯
1、写完SQL先expain查看执行计划(SQL性能优化)。
2、操作update或者delete语句,加个limit。
1) 降低写错SQL的代价
2)SQL效率很可能更高
3)可以避免长事务
4)数据量过大,容易把cpu打满
3、设计表的时候,所有表和字段都添加相应的注释(SQL规范优雅)。
4、SQL书写格式,关键字大下保持一致,使用缩进。
5、insert语句标明对应的字段名称。
6、变更SQL操作先在测试环境执行,写明详细的操作步骤以及回滚方案,并在生产前review。
7、设计数据库表的时候,加上三个字段:主键、create_time、update_time。
8、写完SQL语句,检查where、order by、group by后面的列,多表关联的列是否已加索引,优先考虑组合索引(SQL性能优化)。
9、修改或者删除重要数据前,要先备份。
10、where后面的字段,留意其数据类型的隐式转换。
11、尽量把所有的列定义为NOT NULL。
12、修改或者删除SQL,先写where查一下,确认后再补充delete 或update。
13、减少不必要的字段返回,如使用select <具体字段> 代替 select * 。
1)节省资源、减少网络开销。
select * 数据库需要解析更多对象、字段、权限、属性等。sql语句复杂,硬解析较多,会对数据库造成负担。
若有log、IconMD5等无用且大文本字段,数据传输时网络开销较大,当应用程序和数据库不在同一台服务器时开销非常明显。
对于无用的大字段,长度超过728字节,会先把数据序列化到另一个地方,因此读取这条记录会增加一次IO操作 。
2)可能用到覆盖索引,减少回表,提高查询效率。
mysql优化器‘覆盖索引’策略:例如表t(a,b,c,d,e,f,g) 其中a为主键,b列有索引。
那么磁盘上有两颗B+树,即聚集索引和辅助索引分别为(a,b,c,d,e,f,g)和(b,a),如果用户只需要a、b两列数据。可以直接走辅助索引即可得数据,select * 由于还要获取其他列数据,则需要走辅助索引再走聚集索引,多查了一次B+树速度必然会慢。
由于辅助索引的数据较少。很多情况通过覆盖索引(即通过辅助索引查就能获取用户需要的所有列),直接从内存中取,而聚集索引大概率在磁盘中,所以速度差异显著,几乎是数量级的差异。
14、所有表必须使用Innodb存储引擎。
1)支持事务、支持行级锁、更好的恢复性,高并发下性能更好。
15、数据库和表的字符集尽量统一使用utf-8。
1)可以避免乱码问题。
2)可以避免不同字符集比较转换,导致索引失效问题。
16、尽量使用varchar代替char。
1)变长字段存储空间小。
17、如果修改字段含义或对字段表示的状态追加时。需要及时更新字段注释。
18、SQL命令行修改数据,养成begin+commit事务的习惯。
begin;
update user set name='admin' where id='1';
commit;
19、索引命名要规范,主键索引名为PK_字段名;唯一索引名为UK_字段名;普通索引名则为idx_字段名。
20、where 从句中不对列进行函数转换和表达式计算
21、如果修改/更新数据过多,考虑批量进行。
如:
1)大批量操作会造成主从延迟
2)大批量操作会产生大事务,阻塞
3)大批量操作,数据量过大,会把CPU打满
for each(200) {
delete from user limit 500;
}
本文地址:https://blog.csdn.net/qq_37487977/article/details/110655767