mysql性能优化

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.垂直分割,发访问频率大的字段放一起,频率小的字段放一起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值