Mysql优化 索引优化 优化技术

 Mysql数据库的优化技术

  • 表的设计合理化(符合3NF)
  • 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]
  • 分表技术(水平分割、垂直分割)
  • 读写[写: update/delete/add]分离
  • 存储过程 [模块化编程,可以提高速度]
  • 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ]
  • mysql服务器硬件升级
  • 定时的去清除不需要的数据,定时进行碎片整理(MyISAM)

分析Sql

explain 关键字

  •     id -表结构的顺序
  •     type - const时 表示运用的主键索引 效率最高 (const>eq_ref>ref>range>index>all)
  •     possible kes -  可能用到的索引,
  •     key - 实际用到的索引
  •     key_len -索引长度 越短 越好
  •     ref - 索引是哪一列  越多越好
  •     rows 扫描的行数

Sql优化 

  • 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
  • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null
  • 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
  • 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20  可以这样查询:select id from t where num=10 union all select id from t where num=20'
  • in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3)  对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 3
  •  使用like时 , %在前用不到索引 。"%aa%"不会走索引   "aa%"会走索引
  • 复合索引不遵循最左前缀法则
  • 对索引字段做运算
  • 查询尽量确定的列明,少用*号 明确需要的字段 需要什么字段就查什么字段
  • 尽量少嵌套子查询,这种查询会消耗大量的cpu
  • 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要
  • 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
  • 这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
  • .尽量避免大事务操作,提高系统并发能力
  • 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理
  • 单表列数目必须小于30,若超过则应该考虑将表拆分. 单表列数太多使得Mysql服务器处理InnoDB返回数据之间的映射成本太高
  • 需要JOIN的字段,数据类型必须绝对一致(不一致 索引会失效, 这里的完全一致包括但不限于字段类型、字段长度、字符集、collection等等); 多表关联查询时,保证被关联的字段需要有索引

 什么情况下避免使用索引

  • 索引不应该使用在较小的表上。
  • 索引不应该使用在有频繁的大批量的更新或插入操作的表上。
  • 索引不应该使用在含有大量的 NULL 值的列上。
  • 索引不应该使用在频繁操作的列上。

推荐阅读     

猜你喜欢

转载自blog.csdn.net/weixin_44912855/article/details/114284247