30分钟帮助你提高mysql性能设计

Posted 栗子~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了30分钟帮助你提高mysql性能设计相关的知识,希望对你有一定的参考价值。

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


30分钟帮助你提高mysql性能设计

01 提高性能的方法(mysql):

01::01 Join 表的时候使用相当类型的例,并将其索引

如果你的应用程序有很多 JOIN 查询,你应该确认两个表中 Join 的字段是 被建过索引的。这样,MySQL 内部会启动为你优化 Join 的 SQL 语句的机制。

01::02 为搜索字段建索引

索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段 你总要会经常用来做搜索,那么,请为其建立索引吧。
注: like等范围查找的条件时索引失效,因为索引没有意义,走了全文索引。

01::03 当只要一行数据时使用 LIMIT 1

当你查询表的有些时候,你已经知道结果只会有一条结果,但因为你可能 需要去 fetch 游标,或是你也许会去检查返回的记录数。
在这种情况下,加上 LIMIT 1 可以增加性能。这样一样,MySQL 数据库引擎 会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。

01::04 千万不要 ORDER BY RAND()

打乱返回的数据行并随机挑一个数据?真不知道谁发明了这种用法,但很多新手很喜欢这样用。但你确不了解这样做有多么可怕的性能问题。
这样使用只让你的数据库的性能呈指数级的下降。这里的问题是:MySQL 会不 得不去执行 RAND()函数(很耗 CPU 时间),而且这是为了每一行记录去记行,然 后再对其排序。就算是你用了 Limit 1 也无济于事(因为要排序)。

01::05 避免 SELECT *

从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数 据库服务器和 WEB 服务器是两台独立的服务器的话,这还会增加网络传输的负 载。

01::06 永远为每张表设置一个 ID

我们应该为数据库里的每张表都设置一个 ID 做为其主键,而且最好的是一 个 INT 型的(推荐使用 UNSIGNED),并设置上自动增加的 AUTO_INCREMENT 标 志。
使用 VARCHAR 类型来当主键会使用得性能下降。另外,在你的程序中,你 应该使用表的 ID 来构造你的数据结构,而且,在 MySQL 数据引擎下,还有一些操作需要使用主键,在这些情况 下,主键的性能和设置变得非常重要,比如,集群,分区……

01::07 尽可能的使用 NOT NULL

“Empty”和“NULL”有多大的区别(如果是 INT,那就 是 0 和 NULL),并且 NULL也需要额外的空间,当然特殊的设计除外

02 影响性能的问题(mysql):

02::01 类型转换:

对于Int类型的字段,传varchar类型的值是可以走索引,MySQL内部自动做了隐式类型转换;相反对于varchar类型字段传入Int值是无法走索引的,应该做到对应的字段类型传对应的值总是对的。

02::02 列字符集

从MySQL 5.6开始建议所有对象字符集应该使用用utf8mb4,包括MySQL实例字符集,数据库字符集,表字符集,列字符集。避免在关联查询Join时字段字符集不匹配导致索引失效,同时目前只有utf8mb4支持emoji表情存储。

02::03 索引列被运算

当一个字段被索引,同时出现where条件后面,是不能进行任何运算,会导致索引失效。

02::04 表的链接方式

在MySQL中不建议使用Left Join,即使ON过滤条件列索引,一些情况也不会走索引,导致大量的数据行被扫描,SQL性能变得很差,同时要清楚ON和Where的区别。

02::05 内联子查询

在select后面有子查询的情况称为内联子查询,SQL返回多少行,子查询就需要执行过多少次,严重影响SQL性能。

以上是关于30分钟帮助你提高mysql性能设计的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助来提高 MYSQL 子查询性能

面试官:看到你熟练性能调优,可以说一下你对MySQL索引的理解?

高性能mysql 第三版 中文 PDF

扩展 MySQL 数据库,提高许多连接的性能

mysql性能优化

记一次对以redis做缓存,异步写mysql的系统做性能测试经验