选对合适的存储引擎
在 MySQL 中主要有两种常见的存储引擎:MyISAM 和 InnoDB。
- 如果要求事务类型,那么需选 InnoDB
- 如果只是简单的查询操作,那么 MyISAM 的效率显然要高一些
查询存储引擎设置
1 | -- 查询 MySQL 中存储引擎的默认设置 |
尽可能利用内存而不是磁盘,为查询缓存优化查询
当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。
避免使用像 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