Mysql一些实用的优化实践

大多数的MySQL服务器都启动了查询缓存,但是有些时候,一些特殊的sql语句会阻止MySQL服务器查询缓存执行任务
使用不固定值来查询数据

比如使用now()这种不固定的值来查询数据时,因为返回的数据都是不确定的,根据时间进行响应获取的,所以mysql服务器不会去缓存该数据,代码如下:

SELECT * FROM tableName WHERE ptime LIKE NOW();
获取唯一行时限制1

有时候我们去数据库中查询数据时已经确定了该数据只有一条的时候,可以在后面添加一个限制1的条件,这样可以让数据库引擎在找到1之后就停止记录,而不会去搜素整个表或者索引

#需求
用户名和密码进行登录
#优化前
SELECT * FROM user WHERE username="chengxi" AND password="chengxi";
#优化后
SELECT * FROM user WHERE username="chengxi" AND password="chengxi" LIMIT 1;
充分利用索引来搜素字段

索引不只是主键或者唯一键,通常情况下,你可以将你的条件列设置为索引,当然,有时候还需要去了解那些类型的搜素不能够使用常规的索引

#优化前
SELECT * FROM tableName WHERE COL="col1";

#优化后
ALTER TABLE tableName ADD INDEX('COL');
SELECT * FROM tableName WHERE COL="col1";
避免select *,最好指定所要查询的所有列名

有几种情况:
1.我们只是需要里面的几个列值而查询所有的话就会增加磁盘操作的空间
2.如果我们在后续增加列,那么就会查询所有的数据,这样看起来没关系,但是如果在我们将返回的数据封装成一个自定义的entity实体类时就会发生报错了
所以,总是在执行select查询时执行需要查询哪些列是一个好的习惯

最好设置id为主键,即使是在唯一用户名的用户表中

即使用户表中的用户名字段是唯一的,也最好不要将其设置为主键,因为varchar作为主键的效率较低

varchar类型的值能用enum最好用enum替换

在mysql中的enum类型的值是非常的紧凑和快速的,他们在内部的存储类似于TINYINT,但是他们可以包含并显示字符串值。
如果设置为varchar的字段的值只有固定几个值,就将它设置为enum类型吧

如果可以的话,多用NOT NULL来定义mysql列

在mysql中,NULL列需要额外的空间进行存储,他们会增加比较语句的复杂性。除非你有一个非常具体的理由来让该列为NULL值,否则就加上NOT NULL定义吧

固定长度表(静态表)的查询效率会更快

如果表中的每一列都是固定长度的,即不包含varchar/text/blob等可变长度数据类型时,那么该表就是静态表,
静态表可以提高性能,不需要每次查找都查询主键列
静态表占用的空间比动态表大,比如varchar(20)与char(20)就是这个原因

参考文献

20多个MySQL最佳实践与优化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章