MySQL 优化知识笔记整理

优化数据类型

  1. 避免使用 NULL,NULL 需要特殊处理, 大多数时候应该使用 NOT NULL,或者使用一个特殊的值,如 0,-1 作为默认值。
  2. 仅可能使用更小的字段,MySQL 从磁盘读取数据后是存储到内存中 的,然后使用 cpu 周期和磁盘 I/O 读取它,这意味着越小的数据类型占用的空间越小.
  3. 使用ENUM 而不是VARCHAR。 ENUM保存的是TINYNT,例如“性别” 、“状态”这些有限且固定的字段就可以用这个类型。

为查询缓存优化查询

很多MySql服务器是开启了查询缓存的。当有很多相同的查询被执行了很多次的时候,这些查询结果会被放在缓存中,后续的查询就会直接访问缓存结束。因为为查询缓存优化查询语句就很有必要。
用变量代替MySql的函数,从而开启缓存。例如

// 开启查询缓存
$date = date("Y-m-d")
$r = mysq_query("SELECT  name FROM users Where birth >= ' $date' ")

课外:注意MySQL8.0 之后就取消了缓存,之前的版本可以通过将query_cache_type 为 DEMAND 取消缓存设置

小心字符集转换

客户端或应用程序使用的字符集可能和表本身的字符集不一样,这需要
MySQL 在运行过程中隐含地进行转换,此外,要确定字符集如 UTF-8是否支持多字节字符,因此它们需要更多的存储空间。

当只要一行数据时使用LIMIT 1

已知查询结果只会有一条结果时加上 limit 1 可以增加性能。当Mysql 数据库找到一条符合条件的结果后停止搜索,而不是继续查找。

为搜索字段建立索引

这个是大家基本都知道的点,但是需要知道在合适的情况下建立合适的索引。比如全文索引可以建立在文章中搜索某一个词时。

join表时使用相当类型的列,并将其索引

被join的字段应该是相同类型的。

优化子查询

遇到子查询时,MySQL 查询优化引擎并不是总是最有效的,这就是为
什么经常将子查询转换为连接查询的原因了,优化器已经能够正确处理
连接查询了,当然要注意的一点是,确保连接表 (第二个表) 的连接列
是有索引的,在第一个表上 MySQL 通常会相对于第二个表的查询子
集进行一次全表扫描,这是嵌套循环算法的一部分。

优化 UNION

在跨多个不同的数据库时使用 UNION 是一个有趣的优化方法,UNION 从两个互不关联的表中返回数据,这就意味着不会出现重复的行,同时也必须对数据进行排序,我们知道排序是非常耗费资源的,特别是对大表的排序。
UNION ALL 可以大大加快速度,如果你已经知道你的数据不会包括重复行,或者你不在乎是否会出现重复的行,在这两种情况下使用UNION ALL 更适合。此外,还可以在应用程序逻辑中采用某些方法避免出现重复的行,这样 UNION ALL 和 UNION 返回的结果都是一样的,但 UNION ALL 不会进行排序。

避免select * 查询

从数据库中读取的数据越多,查询就越慢。

选择合适的存储引擎

MyISAM 适合需要大量查询的应用,对大量读写操作不是很友好。
InnoDB “行锁” 适合写操作多的时候,并且支持事务等

优化 count(my col) 和 count( )

拆分大的DELETE 或者INSERT语句

大家都知道DELETE和INSERT两个操作不慎是会锁表的,表锁了,别的操作就无效,严重的可能会让服务器宕机。所以当你有一个大的处理时,建议将其拆分。例如 每执行1000条,休息会再执行剩下的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值