MySQL优化

MySQL优化

  • MySQL优化
    • 索引
      • 索引的优势和劣势
      • 不建议使用索引
      • 索引分类
        • 主键索引
        • 唯一索引
        • 单值索引
        • 复合索引
      • Explain
        • id
        • table
        • select_type
        • type
        • possible_key
        • key
        • ref
        • rows
        • extra
      • 索引失效的情况
      • 排序优化
      • 关联查询优化

MySQL优化

MySQL优化是通过对查询语句和数据库结构进行优化,以提高数据库性能和查询效率的过程。MySQL优化的主要目标是减少查询时间、减少数据库资源的消耗,并提高系统的响应速度。

一种常见的MySQL优化方法是使用合适的索引。索引是一种数据结构,能够加速数据的查找和排序。通过在查询语句的关键列上创建索引,可以减少查询的扫描范围,从而提高查询速度。可以使用EXPLAIN语句来分析查询语句的执行计划,以确定是否使用了合适的索引。

另外,优化查询语句的编写方式也是MySQL优化的重要方面。可以避免不必要的JOIN操作、减少查询的数据量、避免使用SELECT * 等不必要的列,以及使用LIMIT来限制结果集的大小等。

MySQL还提供了一些性能调优参数,可以根据实际情况进行调整。例如,可以调整innodb_buffer_pool_size参数来优化InnoDB存储引擎的缓冲池大小,以提高读取性能。可以调整max_connections参数来控制并发连接数,以提高系统的响应能力。

在优化过程中,还可以利用MySQL的查询缓存功能,将经常执行的查询结果缓存起来,减少数据库的访问次数,提高查询的响应速度

综上所述,MySQL优化涉及多个方面,包括合适的索引设计、优化查询语句、调整性能参数等。通过综合使用这些方法,可以提高MySQL数据库的性能和查询效率

sql性能下降原因:

1、查询语句写的烂

2、索引失效

3、关联查询太多join

4、服务器调优及各个参数设置(例如缓冲和线程数等)

通常sql调优过程

1、开启慢查询并捕获

2、explain+慢sql分析

3、show profile 查询sql在mysql服务器里面的执行细节和生命周期情况

4、SQL数据库服务器的参数调优

索引

一种排序好了的数据结构 B+树

索引的优势和劣势

索引的优势

1、提高数据查询效率,降低数据库的IO成本

2、索引对数据进行排序,降低数据排序成本,降低了CPU消耗

劣势

1、索引实际上也是一张表,保存了主键和索引的字段,占用空间

2、降低表的更新速度,因为在更新表的时候,还需要保存索引文件

不建议使用索引

不建议使用索引:

1、表的记录太少

2、经常增删改的表

3、where条件里用不到的字段

索引分类

主键索引

1、表中的列设置成为主键后,数据库会自动建立主键索引

2、单独创建主键索引:

​ a、创建:alter table 表名 add primary key(字段)

​ b、删除:alter table 表名 drop primary key (字段)

唯一索引

1、表中的列创建了唯一约束时,数据库会自动建立唯一索引

2、单独创建唯一索引:

​ a、创建:alter table 表名 add unique 索引名(字段)

​ 或者 create unique index 索引名 on表名(字段)

​ b、删除:drop index 索引名 on 表名

单值索引

一个索引只包含单个列,一个表可以有多个单值索引

复合索引

一个索引包含多个列

Explain

使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈

在这里插入图片描述

id

id相同的时候,执行顺序是从上往下

id不同的时候,id的值越大优先级越高,优先级越高,越早执行

table

输出的这一行的数据是关于哪一张表的

select_type

查询的类型,常见值有:

1、**SIMPLE: ** 简单的select查询,查询中不包含子查询或者UNION

2、PRIMARY: 查询中若包含任何复杂的子部分,最外层查询则被标记为primary

3、DERIVED: 在from列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表里

4、SUBQUERY: 在select或where列表中包含了子查询

5、UNION:如果第二个select出现在union之后,则被标记为union,如果union包含在from子句的子查询中,最外层select被标记为derived

6、 **union result :**union的结果

type

1、**system:**表中仅有一行(=系统表)这是const联结类型的一个特例。
2、**const:**表示通过索引一次就找到,const用于比较primary key或者unique索引。因为只匹配一行数据,所以如果将主键置于where列表中,mysql能将该查询转换为一个常量
3、**eq_ref:**唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于唯一索引或者主键扫描
4、**ref:**非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,可能会找多个符合条件的行,属于查找和扫描的混合体
5、**range:**只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引,一般就是where语句中出现了between,in等范围的查询。这种范围扫描索引扫描比全表扫描要好,因为它开始于索引的某一个点,而结束另一个点,不用全表扫描
6、index:index 与all区别为index类型只遍历索引树。通常比all快,因为索引文件比数据文件小很多。
7、**all:**遍历全表以找到匹配的行

从最好到最差的排序依次是:system > const > eq_ref > ref > range > index > all

注意:一般保证查询至少达到range级别,最好能达到ref

possible_key

possible_key:显示可能应用在这张表中的索引,一个或多个。查询设计到的字段上如果存在素索引,则该索引将会被列出来,但不一定会被查询实际使用上

key

key:查询中实际使用的索引

key_len:符合索引中key_len越长越好

ref

ref:显示索引的哪一列被使用了,哪些列或常量被用于查找索引列上的值

rows

rows列显示MySQL认为它执行查询时必须检查的行数,一般越少越好

extra

一些常见的重要的额外信息:

Using filesort:MySQL无法利用索引完成的排序操作称为“文件排序”

Using temporary:MySQL在对查询结果排序时使用临时表,常见于排序order by 和分组查询group by

Using index:表示索引被用来执行索引键值的查找,避免访问了表的数据行,效率不错

Using where :表示使用了where过滤

索引失效的情况

1、最佳左前缀法则:如果索引了多列,要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不挑锅索引中的列,如果不满足最佳左前缀法则的话,索引失效

2、不在索引列上做任何计算、函数操作、会导致索引失效而转向全表扫描

3、存储引擎不能使用索引中范围条件右边的列(就是指在进行范围判断右边的列不会使用索引)

4、MySQL在使用不等于时无法使用索引,会导致全表扫描

5、is null 可以使用索引,但是 is not null 无法使用索引

6、like以通配符开头会使索引失效

7、字符串不加单引号索引会失效

8、使用or连接时,索引也会失效

排序优化

1、尽量避免使用Using FileSort 方式排序

2、order by 语句使用索引最左前列(并且排序方式需要保持一致)或使用where子句和order by子句条件组合满足索引最左前列 比如 where a order by b c ------------索引 a b c 也是生效的

3、where子句中如果出现索引范围查询会导致order by 索引失效

关联查询优化

内连接的时候,mysql会自动把小结果集的选为驱动表,所以大表的字段最好加上索引,左外连接时,左表会全表扫描,所以右边的大表字段最好加上索引。右外连接同理。

你可能感兴趣的:(mysql,mysql,数据库)