选对合适的存储引擎

在 MySQL 中主要有两种常见的存储引擎:MyISAM 和 InnoDB。

  • 如果要求事务类型,那么需选 InnoDB
  • 如果只是简单的查询操作,那么 MyISAM 的效率显然要高一些

查询存储引擎设置

1
2
3
4
5
-- 查询 MySQL 中存储引擎的默认设置
SHOW VARIABLES LIKE '%storage_engine%';

-- 查看 MySQL 中的存储引擎类型
SHOW ENGINES;

尽可能利用内存而不是磁盘,为查询缓存优化查询

当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。

避免使用像 NOW() 和 RAND() 或此类的 SQL 内置函数,因为这些函数的返回是会不定的,所以都不会开启查询缓存。

充分利用索引,为搜索字段建立索引

索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索,为其建立索引。

垂直分割

“垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。

不过要注意,这些被分出去的字段所形成的表,是不会经常性地去 JOIN,不然的话,性能反而比之前的要更糟。

拆分大的 DELETE 或 INSERT 语句

如果你需要在一个在线的网站上去执行一个大的 DELETE 或 INSERT 查询,你需要非常小心,要避免你的操作让你的整个网站停止相应。因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了。

如果你有一个大的处理,要将其拆分,使用 LIMIT 条件是一个好的方法。

使用一个对象关系映射器(Object Relational Mapper)

ORM 能够获得可靠的性能增涨,同时也避免了一些 SQL 注入,提升了安全性,何乐而不呢。

ORM 的最重要的是”Lazy Loading”,也就是说,只有在需要的去取值的时候才会去真正的去做。但同时也要注意一些副作用,因为这很有可能会因为要去创建很多很多小的查询反而会降低性能。

避免几个查询

  • **避免使用 SELECT ***: 从数据库里读出越多的数据,查询就会变得越慢
  • 避免使用 ORDER BY RAND(): 因为 MySQL 会不得不去执行 RAND() 函数,而且这是为了每一行记录,然后再对其排序。就算是你用了 LIMIT 1 也同样要排序
  • 避免全表扫描: 单条查询最后增加 LIMIT 1
  • 避免额外的比较: 尽可能的使用 NOT NULL

参考链接