mysql常见的优化_【阶段性总结】MySQL常用优化

这份优化总结酝酿了有段时间了,主要始从自己目前在带领的一个项目当中吸取的、经历的,以及从自己了解到的一些实用的mysql语句或者设计方面的优化方案,特别是sql语句的书写方面。

话不多说,直接开始。

一、语句优化

1、select时尽量不要用*。需要什么字段、多少字段则写多少。如果使用*,数据库还需要在执行完语句之后进行字段的转换。

2、普通情况下少用group by。group by在表数据很大,几十万就开始表现出缓慢,几百万或者上千万则会达到十秒以上的缓慢(具体要视语句而定);一般可以通过关联查询或者distinct来代替一下,如果非要用group by,可以考虑对分组的字段添加索引。

3、善用limit。limit的实用更多是在分页中使用,这里延生一种使用方式是:在查询结果明确了为一条或者只想获取第一条记录的话,可以加入 “limit 1”,不需要查询出来再get第一条记录。limit 1在查询到第一条记录后会停止查询,提高查询效率。

4、灵活运用exist和in、not exist和not in 两组关键字。不深入讨论,简单的说一下使用场景:

exist和in:假设有两个待查询的表,如果两个表的数据量相差不大,那么用in和exists差别不大;如果两个表中数据量一个较小一个较大,则子查询表大的用exists,子查询表小的用in;

not exsit 和 not in:用not exsit 总是比 not in效率高。

5、查询字段为空的条件时,注意查询 is not null 和 != '' 的结合使用,前者是查询数据库值不为数据库NULL 的,后者是查询内容不为空的;特别是列表查询反选查询不为空的条件时,这两个都要加上。

6、多用函数。MySQL的函数方法非常多,包括运算函数、操作函数等,日常的业务使用中,字符拼接、数量计算、字符截取、日期时间格式化、case when 、if 和 ifNull等等,都能在数据操作这一层面解决,可以减少页面标签或其他应用端的再度转换。

7、用order by field 自定义排序。将查询后的结果(注意是:结果,例如 as 之后的别名),按照自定义的排序。简例:SELECT CANCAT(my_level,'级') as level FROM my_info WHERE sex = 1 ORDER BY FIELD(level,'0级','1级','2级','3级','4级','5级') ASC 。

二、结构优化

1、选择合适的引擎。几个常用的MySQL数据引擎要知道,例如最常用的InnoDB 和 MyISAM 。如果写或改数据都是日常操作,则选用InnoDB,因为Inn DB有事务操作,总体来说性能比较综合;但如果在读写分离的多数据库情况下,读的数据库最好采用My ISAM,因为MyISAM 没有事务的概念,在搜索和检索方面却是强化了的。

2、利用索引。索引是双刃剑,用得好能大幅度提高效率,用得不好会阻塞数据库;一般来说,读取或查询较多、字符串字段、非NULL的字段的有利于索引的应用。

3、用上存储过程和触发器。存储过程、触发器能在数据的增查改上很好的改善数据联动,并非数据的改动上都需要动用到代码层。例如某一字段的变动,会单纯触发其他表格的字段变动,则可以用上触发器,可以不使用代码定时器来处理。例如对某一类似的列表进行查询,会返回不同的结果字段但整体结构相似,可以使用存储过程。

三、Tips

1、在对SQL语句有疑惑或者功能语句存在多种解决方案的情况下,可以使用DESC 关键字对SQL 语句进行分析,查看SQL的语句性能、是否利用到索引等分析,从而进一步了解如何优化SQL。

例:如图

9e1624bc231b6cc4e69cb94b463012e7.png

2、在Java中,可以对几个通用的字段进行提炼,例如创建时间、主键、更新时间等,作为BaseEntity,然后所有需要到这些字段的都继承该实体

TO BE CONTINUE ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值