mysql的优化方案

为什么要优化Mysql

  1. 系统的吞吐量瓶颈往往出现在数据库的访问速度上,

  2. 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相 应变慢

  3. 数据是存放在磁盘上的,读写速度无法和内存相比

如何优化,以及优化的方案

  1. 设计数据库时:数据库表、字段的设计,存储引擎
  2. 利用好MySQL自身提供的功能,如索引等
  3. SQL语句的优化(收效甚微)
  4. 横向扩展:MySQL集群、负载均衡、读写分离
  5. 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)

数据库的设计

  1. 字段类型的选择,设计规范,范式,常见设计案例
  2. 原则:尽量使用整型表示字符串
  3. MySQL内部的枚举类型(单选)和集合(多选)类型
  4. 原则:定长和非定长数据类型的选择
  5. 原则:尽可能选择小的数据类型和指定短的长度
  6. 原则:字段注释要完整,见名知意
  7. 原则:单表字段不宜过多

存储引擎选择

  1. Innodb不断完善,从各个方面赶超MyISAM,也是MySQL默认使用的

索引

  • 关键字相对于数据本身,==数据量小==
  • 关键字是==有序==的,二分查找可快速确定位置
  • 普通索引(key),唯一索引(unique key),主键索引(primary key),全文索引(fulltext key)

水平分割和垂直分割

  • 水平分割:通过建立结构相同的几张表分别存储数据

  • 垂直分割:将经常一起使用的字段放在一个单独的表中,分割后的表记录之间是一一对应关系

  • 集群

  1. 横向扩展:从根本上(单机的硬件处理能力有限)提升数据库性能 。由此而生的相关技术:==读写分离、负载均衡==

数据库查询语句优化

  1. 避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
  2. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
  3. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。可以在查询为空的字段上设置默认值为0 这样的查询效率会比设置为null高
  4. in 和 not in 也要慎用,否则会导致全表扫描,如
    select id from t where num in(1,2,3)
    改成这样比较好一点
    select id from t where num between 1 and 3
  5. 用 exists 代替 in 是一个好的选择:
    select num from a where num in(select num from b)
    用下面的语句替换:
    select num from a where exists(select 1 from b where num=a.num)
  6. 尽量避免大事务操作,提高系统并发能力
  7. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
  8. 尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限
  9. 避免频繁创建和删除临时表,以减少系统表资源的消耗
  10. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
  11. 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

[文章借鉴] (https://www.nowcoder.com/discuss/150059?type=0&order=0&pos=13&page=0)

你可能感兴趣的:(mysql的优化方案)