1. 获取唯一行时使用LIMIT 1
有时当你查表时,你已经知道你正在查找的结果只有一行。你可能正在获取唯一记录,或者你可能只是查询是否存在满足你的WHERE子句条件的记录。
在这种情况下,将LIMIT 1添加到查询条件中可以提高性能。这样,数据库引擎将在找到刚刚第一个记录之后停止扫描记录,而不是遍历整个表或索引。
2. 避免使用SELECT *,指定你要搜索的字段
从数据表中读取的数据越多,查询操作速度就越慢。它增加了磁盘操作所需的时间。此外,当数据库服务器与Web服务器分开时,由于必须在服务器之间传输数据,将会有更长的网络延迟。
3. 保证命中索引
4. 如果可以的话使用NOT NULL(且不能在允许null的字段中建立索引)
除非你有非常重要的理由使用NULL值,否则你应该设置你的列为NOT NULL。
首先,问一下你自己在空字符串值和NULL值之间(对应INT字段:0 vs. NULL)是否有任何的不同.如果没有理由一起使用这两个,那么你就不需要一个NULL字段(你知道在Oracle中NULL和空字符串是一样的吗?)。
NULL列需要额外的空间,他们增加了你的比较语句的复杂度。如果可以的话尽量避免它们。当然,我理解一些人,他们也许有非常重要的理由使用NULL值,这不总是一件坏事。
摘自MySQL 文档:
"NULL列在行记录它们的值是否为NULL时需要额外的空间。例如MyISAM 表,每一个NULL列拥有额外的一个比特,聚集在最近的字节。"
5. 固定长度(静态)的表会更快(所有字段长度固定)
(译者注:这里提到的表的长度,实际是指表头的长度,即表中每条数据占用的空间大小,而不是指表的数据量)
如果表中所有列都是“固定长度”,那么这个表被认为是“静态”或“固定长度”的。不固定的列类型包括 VARCHAR、TEXT、BLOB等。即使表中只包含一个这些类型的列,这个表就不再是固定长度的,MySQL 引擎会以不同的方式来处理它。
固定长度的表会提高性能,因为 MySQL 引擎在记录中检索的时候速度会更快。如果想读取表中的某一地,它可以直接计算出这一行的位置。如果行的大小不固定,那就需要在主键中进行检索。
它们也易于缓存,崩溃后容易重建。不过它们也会占用更多空间。例如,如果你把一个 VARCHAR(20) 的字符改为 CHAR(20) 类型,它会总是占用 20 个字节,不管里面存的是什么内容。
你可以使用“垂直分区”技术,将长度变化的列拆分到另一张表中。来看看:
6. int,smallint,tinyint使用场景
三者都是以固定长度存储在数据库中,int 4个字节【-2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647)。长度范围0-10】,smallint 两个字节【 带符号的范围是-32768到32767。无符号的范围是0到65535。 长度0-5】, tinyint 1个字节【0-255。长度0-3】的整数
7.慎用负向查询,如!=,<>,not in,not like
不用百分号开头的模糊查询
因为此两种方法不命中索引,会导致全表扫描
8.不要在数据库字段上计算或者运行函数
这样就不能命中索引
9.大表不要用join和子查询
10.用in来代替or,旧版本mysql的or不能命中索引,且or更消耗cpu
11.莫占用数据库的cpu来实现复杂的逻辑(join,子查询,触发器,用户自定义函数等)
12.不要用外键,通过程序来约束
13.不要使用float或double,计算时会产生精度上的错误
14.每张表都要有updated_at,created_at操作
15.垂直分割,发访问频率大的字段放一起,频率小的字段放一起