mysql调优

文章目录

    • 性能分析
    • mysql内部执行
    • 从sql层的常用调优
    • 从使用方案层调优
    • 参考 [https://www.cnblogs.com/liujiacai/p/7605612.html](https://www.cnblogs.com/liujiacai/p/7605612.html)

中小型项目推荐使用mysql

性能分析

在mysql的配置文件里开启慢sql日志的记录
必要的话开启无索引的sql日志记录
使用mysql的执行计划分析sql的性能瓶颈EXPLAIN

mysql内部执行

mysql调优_第1张图片

从sql层的常用调优

  1. 单条查询最后添加 LIMIT 1,停止全表扫描。
  2. 不用 MYSQL 内置的函数。由于内置函数不会建立查询缓存。
  3. 使用 IP 而不是域名做数据库路径。避免 DNS 解析问题
  4. 将非”索引”数据分离,比方将大篇文章分离存储,不影响其它自己主动查询。
  5. 避免使用insert,deleted操作,会锁表
  6. 为搜索字段建索引
  7. 在Join表的时候使用相当类型的例,并将其索引
  8. 千万不要 ORDER BY RAND() ,MySQL会不得不去执行RAND()函数(很耗CPU时间),而且这是为了每一行记录去记行,然后再对其排序
  9. 避免 SELECT *
  10. 永远为每张表设置一个ID,使用 VARCHAR 类型来当主键会使用得性能下降。
  11. 使用 ENUM 而不是 VARCHAR ,保存类型使用TINYINT
  12. 尽可能的使用 NOT NULL,使用null也需要额外的空间,同样影响查询效率
  13. 设计表遵循3大范式
  14. 通常来说把可为NULL的列改为NOT NULL不会对性能提升有多少帮助,只是如果计划在列上创建索引,就应该将该列设置为NOT NULL。
  15. 对整数类型指定宽度,比如INT(11),没有任何卵用。INT使用32位(4个字节)存储空间,那么它的表示范围已经确定,所以INT(1)和INT(20)对于存储和计算是相同的。
  16. UNSIGNED表示不允许负值,大致可以使正数的上限提高一倍。比如TINYINT存储范围是-128 ~ 127,而UNSIGNED TINYINT存储的范围却是0 - 255。
  17. 通常来讲,没有太大的必要使用DECIMAL数据类型。即使是在需要存储财务数据时,仍然可以使用BIGINT。比如需要精确到万分之一,那么可以将数据乘以一百万然后使用BIGINT存储。这样可以避免浮点数计算不准确和DECIMAL精确计算代价高的问题。
  18. TIMESTAMP使用4个字节存储空间,DATETIME使用8个字节存储空间。因而,TIMESTAMP只能表示1970 - 2038年,比DATETIME表示的范围小得多,而且TIMESTAMP的值因时区不同而不同。
  19. 大多数情况下没有使用枚举类型的必要,其中一个缺点是枚举的字符串列表是固定的,添加和删除字符串(枚举选项)必须使用ALTER TABLE(如果只只是在列表末尾追加元素,不需要重建表)。
  20. schema的列不要太多。原因是存储引擎的API工作时需要在服务器层和存储引擎层之间通过行缓冲格式拷贝数据,然后在服务器层将缓冲内容解码成各个列,这个转换过程的代价是非常高的。如果列太多而实际使用的列又很少的话,有可能会导致CPU占用过高。
  21. 大表ALTER TABLE非常耗时,MySQL执行大部分修改表结果操作的方法是用新的结构创建一个张空表,从旧表中查出所有的数据插入新表,然后再删除旧表。尤其当内存不足而表又很大,而且还有很大索引的情况下,耗时更久。当然有一些奇技淫巧可以解决这个问题,有兴趣可自行查阅。
  22. 优化UNION MySQL处理UNION的策略是先创建临时表,然后再把各个查询结果插入到临时表中,最后再来做查询。因此很多优化策略在UNION查询中都没有办法很好的时候。经常需要手动将WHERE、LIMIT、ORDER BY等字句“下推”到各个子查询中,以便优化器可以充分利用这些条件先优化。
    除非确实需要服务器去重,否则就一定要使用UNION ALL,如果没有ALL关键字,MySQL会给临时表加上DISTINCT选项,这会导致整个临时表的数据做唯一性检查,这样做的代价非常高。当然即使使用ALL关键字,MySQL总是将结果放入临时表,然后再读出,再返回给客户端。虽然很多时候没有这个必要,比如有时候可以直接把每个子查询的结果返回给客户端。

从使用方案层调优

  1. 充分使用索引 创建高性能索引
  2. 提高磁盘读写速度
  3. 降低磁盘写入操作,加大内存缓存
  4. 数据预热
  5. 选择合适的存储引擎: InnoDB,支持缓存,支持事务,支持行锁
  6. 查询结果变化频率低的建议使用缓存 系统函数 自定义函数是不支持缓存的
  7. 无缓冲的查询
  8. 把IP地址存成 UNSIGNED INT
  9. 固定长度的表会更快
  10. 垂直分割
  11. 越小的列会越快
  12. 使用一个对象关系映射器(Object Relational Mapper)
  13. 小心“永久链接” ,“永久链接”的目的是用来减少重新创建MySQL链接的次数。当一个链接被创建了,它会永远处在连接的状态,就算是数据库操作已经结束了。

参考 https://www.cnblogs.com/liujiacai/p/7605612.html

你可能感兴趣的:(mysql调优)