Mysql优化

182 阅读5分钟

Mysql优化

Mysql的逻辑结构
组件:客户端、核心服务、存储引擎
在这里插入图片描述
Mysql查询的5个过程过程:

  • 客户端向MySQL服务器发送一条查询请求
  • 服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段
  • 服务器进行SQL解析、预处理、再由优化器生成对应的执行计划
  • MySQL根据执行计划,调用存储引擎的API来执行查询
  • 将结果返回给客户端,同时缓存查询结果

Mysql 优化的三个方向:

a.设计合理Schemea
1. 通常来说把可为NULL的列改为NOT NULL不会对性能提升有多少帮助,只是如果计划在列上创建索引,就应该将该列设置为NOT NULL。
2. 对整数类型指定宽度,比如INT(11),没有任何卵用。INT使用32位(4个字节)存储空间,那么它的表示范围已经确定,所以INT(1)和INT(20)对于存储和计算是相同的。
3.UNSIGNED表示不允许负值,大致可以使正数的上限提高一倍。比如TINYINT存储范围是-128 ~ 127,而UNSIGNED TINYINT存储的范围却是0 - 255。
4. 通常来讲,没有太大的必要使用DECIMAL数据类型。即使是在需要存储财务数据时,仍然可以使用BIGINT。比如需要精确到万分之一,那么可以将数据乘以一百万然后使用BIGINT存储。这样可以避免浮点数计算不准确和DECIMAL精确计算代价高的问题。
5. TIMESTAMP使用4个字节存储空间,DATETIME使用8个字节存储空间。因而,TIMESTAMP只能表示1970 - 2038年,比DATETIME表示的范围小得多,而且TIMESTAMP的值因时区不同而不同。
6. 大多数情况下没有使用枚举类型的必要,其中一个缺点是枚举的字符串列表是固定的,添加和删除字符串(枚举选项)必须使用ALTER TABLE(如果只只是在列表末尾追加元素,不需要重建表)。
7. schema的列不要太多。原因是存储引擎的API工作时需要在服务器层和存储引擎层之间通过行缓冲格式拷贝数据,然后在服务器层将缓冲内容解码成各个列,这个转换过程的代价是非常高的。如果列太多而实际使用的列又很少的话,有可能会导致CPU占用过高。
8. 大表ALTER TABLE非常耗时,MySQL执行大部分修改表结果操作的方法是用新的结构创建一个张空表,从旧表中查出所有的数据插入新表,然后再删除旧表。尤其当内存不足而表又很大,而且还有很大索引的情况下,耗时更久。当然有一些奇技淫巧可以解决这个问题,有兴趣可自行查阅。

b.创建高性能索引
索引的类别

  • PRIMARY KEY: 主键,这意味着索引值必须是唯一的,且不能为NULL。
  • UNIQUE:创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
  • INDEX: 普通索引,索引值可出现多次。
  • FULLTEXT: 用于全文索引.

使用索引的注意事项:

  1. 表的主键和外键必须有索引
  2. 经常出现where字句的字段
  3. 经常要查询的列
  4. 选择性高的字段
  5. 经常用户排序的字段
  6. 数据超过300以上
  7. 表的索引最好不要超过5个

c.根据业务需求选择合理的数据类型和存储引擎

引擎(engine)说明及区别

ISAM引擎:读取数据速度很快,而且不占用大量的内存和存储资源;但是ISAM不支持事务处理、不支持外来键、不能够容错、也不支持索引。
如果硬盘崩溃,数据文件也无法恢复,因此若把ISAM用在关键任务上,就必须经常备份实时数据。

MyISAM引擎:MyISAM强调了快速读取操作。(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
静态MyISAM:如果数据库中的各个数据列的长度都是预先固定好的,服务器将自动选择这种表类型。(1)表中每一条记录所占用的空间都是一样的,所以存取和更新的效率非常高。(2)当数据受损时,回复工作也比较容易做。
动态MyISAM:如果数据表中出现varchar、xxxtex或xxxBLOB字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小。
压缩MyISAM:这种类型的表进一步减小了占用的存储,但是这种表压缩之后不能再被修改。
memory(heap)适合:HEAP允许只驻留在内存里的临时表格。因为数据仅存储在内存中,因此数据存取速度比ISAM和MYISAM都快。利用HASH进行索引(记住,用完表格之后就删除表格)

InnoDB引擎:具有提交、回滚和崩溃恢复能力的失误安全存储引擎。(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
唯一一个支持外键的引擎。

archive引擎:日志记录和聚合分析方面。archive不支持索引,仅支持insert和select语句。

在这里插入图片描述