真·mysql中的SQL优化

1. 优化SQL语句中的一般步骤


通过show status命令了解各种SQL的执行频率

这里写图片描述
这里写图片描述
这里写图片描述

定位执行效率较低的SQL语句

  • 可以通过以下两种方式定位执行效率较低的SQL语句。 通过慢查询日志定位那些执行效率较低的SQL语句,用-log-slow-queries[=file_name]选 项启动时,mysqld写一个包含所有执行时间超过long_query_time秒的SQL语句的日志 文件。

  • 慢查询日志在查询结束以后才纪录,所以在应用反映执行效率出现问题的时候查询慢 询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程, 包括线程的状态、是否锁表等,可以实时地查看SQL的执行情况,同时对一些锁表操 作进行优化。

通过EXPLAIN分析低效的SQL执行计划

这里写图片描述

这里写图片描述
每个列的简单解释如下:

  • select_type:表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接
    或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或
    者后面的查询语句)、SUBQUERY(子查询中的第一个 SELECT)等。

  • table:输出结果集的表。

  • type:表示表的连接类型,性能由好到差的连接类型为 system(表中仅有一行,即
    常量表)、const(单表中最多有一个匹配行,例如 primary key 或者 unique index)、 eq_ref(对于前面的每一行,在此表中只查询一条记录,简单来说,就是多表连接 中使用primarykey或者uniqueindex)、re(f 与eq_ref类似,区别在于不是使用primary key 或者 unique index,而是使用普通的索引)、ref_or_null(与 ref 类似,区别在于 条件中包含对 NULL 的查询)、index_merge(索引合并优化)、unique_subquery(in 的后面是一个查询主键字段的子查询)、index_subquery(与 unique_subquery 类似, 区别在于 in 的后面是查询非唯一索引字段的子查询)、range(单表中的范围查询)、 index(对于前面的每一行,都通过查询索引来得到数据)、all(对于前面的每一行,都通过全表扫描来得到数据)。

  • possible_keys:表示查询时,可能使用的索引。

  • key:表示实际使用的索引。

  • key_len:索引字段的长度。

  • rows:扫描行的数量。

  • Extra:执行情况的说明和描述。

确定问题并且采取相应的优化措施

这里写图片描述
这里写图片描述
这里写图片描述

*2. 索引问题


  • 索引的存储分类

        MyISAM 存储引擎的表的数据和索引是自动分开存储的,各自是独立的一个文件;InnoDB 存储引擎的表的数据和索引是存储在同一个表空间里面,但可以有多个文件组成。
        MySQL 中索引的存储类型目前只有两种(BTREE 和 HASH),具体和表的存储引擎相关: MyISAM 和 InnoDB 存储引擎都只支持 BTREE 索引;MEMORY/HEAP 存储引擎可以支持 HASH 和 BTREE 索引。
        MySQL 目前不支持函数索引,但是能对列的前面某一部分进索引,例如 name 字段,可 以只取 name 的前 4 个字符进行索引,这个特性可以大大缩小索引文件的大小,用户在设计 表结构的时候也可以对文本列根据此特性进行灵活设计。

  • MySQL如何使用索引
    这里写图片描述

        索引用于快速找出在某个列中有一特定值的行。对相关列使用索引是提高 SELECT 操作 性能的最佳途径。
        查询要使用索引最主要的条件是查询条件中需要使用索引关键字,如果是多列索引,那 么只有查询条件使用了多列关键字最左边的前缀时,才可以使用索引,否则将不能使用索引。

使用索引

在 MySQL 中,下列几种情况下有可能使用到索引。
(1)对于创建的多列索引,只要查询的条件中用到了最左边的列,索引一般就会被使用, 举例说明如下。
首先按 company_id,moneys 的顺序创建一个复合索引,具体如下:
然后按 company_id 进行表查询,具体如下:
这里写图片描述
这里写图片描述
可以发现即便 where 条件中不是用的 company_id 与 m

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值