mysql sql优化建议

1. 为查询缓存优化你的查询

大多数的 MySQL 服务器都开启了查询缓存。这是提高性最有效的方法之 一,而且这是被 MySQL 的数据库引擎处理的。当有很多相同的查询被执行了多 次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不 用操作表而直接访问缓存结果了。 这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的。因 为,我们某些查询语句会让 MySQL 不使用缓存。请看下面的示例:

上面两条 SQL 语句的差别就是 CURDATE() ,MySQL 的查询缓存对这个函数 不起作用。所以,像 NOW() 和 RAND() 或是其它的诸如此类的 SQL 函数都不会开 启查询缓存,因为这些函数的返回是会不定的易变的。所以,你所需要的就是 用一个变量来代替 MySQL 的函数,从而开启缓存。

2. EXPLAIN 你的 SELECT 查询

使用 EXPLAIN 关键字可以让你知道 MySQL 是如何处理你的 SQL 语句的。这 可以帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表 是如何被搜索和排序的……等等,等等。参考:https://blog.csdn.net/weixin_39352976/article/details/89498505 可以通过创建索引等手段优化sql

3. 当只要一行数据时使用 LIMIT 1

select 1 from user where country='china' limit 1

4. 在 Join 表的时候使用相当类型的例,并将其索引

如果你的应用程序有很多 JOIN 查询,你应该确认两个表中 Join 的字段是 被建过索引的。这样,MySQL 内部会启动为你优化 Join 的 SQL 语句的机制。 而且,这些被用来 Join 的字段,应该是相同的类型的。例如:如果你要把 DECIMAL 字段和一个 INT 字段 Join 在一起,MySQL 就无法使用它们的索引。对 于那些 STRING 类型,还需要有相同的字符集才行。(两个表的字符集有可能不 一样)

5. 避免 SELECT *

6. 永远为每张表设置一个 ID

我们应该为数据库里的每张表都设置一个 ID 做为其主键,而且最好的是一 个 INT 型的(推荐使用 UNSIGNED),并设置上自动增加的 AUTO_INCREMENT 标 志。

7. 使用 ENUM 而不是 VARCHAR

ENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表 上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。 如果你有一个字段,比如“性别”,“国家”,“民族”,“状态”或 “部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。

8. 尽可能的使用 NOT NULL

除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的表字段保持 NOT NULL。

9. 固定长度的表会更快

表的字段对应的类型长度指定大小,会使得表查询的更快

10. 拆分大的 DELETE 或 INSERT 语句

大批量的写操作要通过代码分批执行,一次写的少点

11. 越小的列会越快

使用 INT 来做主键,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 会更 经济一些。如果你不需要记录时间,使用 DATE 要比 DATETIME 好得多

12. 选择正确的存储引擎

 在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。酷 壳以前文章《MySQL: InnoDB 还是 MyISAM?》讨论和这个事情。 MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很 好。甚至你只是需要 update 一个字段,整个表都会被锁起来,而别的进程,就 算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。 InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。 并且,他还支持更多的高级应用,比如:事务。

MyISAM 支持表锁,InnoDB 支持表锁和行锁,默认为行锁 表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量 最低 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高

13.使用union all 不使用union

因为使用union会导致全表扫描

14.like语句使用单边模糊查询,并且不使用索引

因为两边模糊查询会导致全表扫描

15.尽量避免使用子查询,可以用join替换之,条件中尽量有强过滤,效率更佳  

16.避免使用or,将or转化为in或union

17.表的关联字段的字符集和数据类型必须一致

关联字段的字符集不一致,导致索引不可用

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值