美文网首页
MySQL 优化

MySQL 优化

作者: 歌哥居士 | 来源:发表于2019-03-27 07:10 被阅读0次

工作时SQL优化步骤

开启慢查询日志
explain分析
show profile
SQL数据库服务器的调优

设计表优化

字段上:

  • 主键字段类型所占空间尽可能的小,这样页的数据就更多
  • 主键最好按顺序增长。
  • 优先数字类型,其次日期或二进制类型,最后是字符串类型。
  • 考虑时间粒度,比如只需要存储年则可以直接用year数据类型。

结构上:

  • 尽量减少外键,必要的反范式化设计,使用部分冗余,空间换取时间。
  • 尽量避免使用触发器,会降低数据导入的效率,会使业务变得更复杂。
  • 严禁使用预留字段。

查询优化

  • 小表驱动大表。
    SELECT * FROM Book WHERE ID in (SELECT bid FROM Category)
    SELECT * FROM Category c WHERE exists (SELECT 1 FROM Book b WHERE b.id = c.bid)
  • 能用where过滤的条件不用having过滤
  • 使用覆盖索引

索引优化

建立时

  • 常用来查询、排序、分组的字段建立索引。
  • 使用短索引。例如char(255) 常用的只在前10-20个,所以不用整列进行索引。
  • 索引列非空。
  • 频繁更新的字段不适合建索引。
  • 优先复合索引。

查询时

  • 不要在索引列上做任何操作:计算、函数、手动或自动类型转换,比如a列类型为varchar,a=1会被自动转型为a='1',varchar列必须加单引号。
  • 避免select *(会全表扫描),最好select列和索引列一致,按需(而且太多列会占用缓冲区)
  • 范围条件后的索引列都用不上索引,所以范围查询的列查询时放到最后,最好建立在索引的最后
  • like中,%与_开头的不会使用索引。目前能使用覆盖索引来避免。
  • 最佳左前缀,不能跳过中间列(跳过后面的都无效)
  • 左右连接的表与on的左右表要对应顺序:t1 left join t2 on t1.col1 = t2.col2不可以是t1 left join t2 on t2.col2 = t1.col1
  • order by后面的索引列要同升同降
  • 索引失效行锁变表锁,务必注意

更新时

  • 尽量不删除数据改为更新状态,删除多了失效索引也就多了。

维护时

  • 删掉重复索引。比如主键同时有主键索引、唯一索引。
  • 删掉冗余索引。比如联合索引中包含主键的索引,因为InnoDB会在每个索引后加主键索引的信息。

操作系统优化

增加TCP支持的队列数:net.ipv4.tcp+max_syn_backlog=65535

硬件优化

选择单核更快的。因为MySQL有些操作只支持单核。

相关文章

网友评论

      本文标题:MySQL 优化

      本文链接:https://www.haomeiwen.com/subject/eifqvqtx.html