功夫码

mysql优化经验

晓峰 时间:2019-07-01 17:49:36 阅读:17

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

简单的来说:SQL查询中不要包含变量,逻辑判断。

2. EXPLAIN 你的 SELECT 查询

使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。

EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的……等等,等等。

挑一个你的SELECT语句(推荐挑选那个最复杂的,有多表联接的),把关键字EXPLAIN加到前面。你可以使用phpmyadmin来做这个事。然后,你会看到一张表格。下面的这个示例中,我们忘记加上了group_id索引,并且有表联接:

当我们为 group_id 字段加上索引后:

我们可以看到,前一个结果显示搜索了 7883 行,而后一个只是搜索了两个表的 9 和 16 行。查看rows列可以让我们找到潜在的性能问题。

EXPLAIN出来的数据,需要关注的点就是:rows

一条SQL是否优秀,就看是不是搜索最少的rows来获取到想要的结果

3. 为搜索字段建索引

不需要多解释,最粗暴的方式,SQL语句中的where 需要查询的字段都可以建立索引

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

两个或者多个表进行联查时,on表达式后面的字段,建议是数据类型一样,这样可以减少数据在匹配的时候,引擎还要做类型转换的工作。

5. 避免 SELECT *

查询需要多少字段,就写多少字段,不要*来做通配符。但如果不需要所有的字段全部查出来,那这条可以忽略

6. 从 PROCEDURE ANALYSE() 取得建议

PROCEDURE ANALYSE() 会让 MySQL 帮你去分析你的字段和其实际的数据,并会给你一些有用的建议。只有表中有实际的数据,这些建议才会变得有用,因为要做一些大的决定是需要有数据作为基础的。

例如,如果你创建了一个 INT 字段作为你的主键,然而并没有太多的数据,那么,PROCEDURE ANALYSE()会建议你把这个字段的类型改成 MEDIUMINT 。或是你使用了一个 VARCHAR 字段,因为数据不多,你可能会得到一个让你把它改成 ENUM 的建议。这些建议,都是可能因为数据不够多,所以决策做得就不够准。

在phpmyadmin里,你可以在查看表时,点击 “Propose table structure” 来查看这些建议

一定要注意,这些只是建议,只有当你的表里的数据越来越多时,这些建议才会变得准确。一定要记住,你才是最终做决定的人。

7. 尽可能的使用 NOT NULL

除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。这看起来好像有点争议,请往下看。

首先,问问你自己“Empty”和“NULL”有多大的区别(如果是INT,那就是0和NULL)?如果你觉得它们之间没有什么区别,那么你就不要使用NULL。(你知道吗?在 Oracle 里,NULL 和 Empty 的字符串是一样的!)

不要以为 NULL 不需要空间,其需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂。 当然,这里并不是说你就不能使用NULL了,现实情况是很复杂的,依然会有些情况下,你需要使用NULL值。

下面摘自MySQL自己的文档:

“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”

8. 根据实际需求选择对应的存储引擎

MYSQL5.*后面的版本中,这个已经越来越不明显,90%的情况都是选择innodb。原因请参考值我之前的文章

9. 批量查询数据

MYSQL支持批量的插入数据,在需要大量插入数据的场景使用(插入数据的多少,跟你MYSQL的配置的max_allowed_packet 值有关,默认是1M),这样的好处就是,1. 一条SQL语句就搞定,2.不需要在做事务来监听是否成功。


本文来源:功夫码(gongfuma.com)

声明:本文系功夫码原创稿件,版权属[功夫码 gongfuma.com]所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:功夫码",违者将依法追究责任。

相关文章

回到顶部