美文网首页
mysql优化方式

mysql优化方式

作者: 陈德华 | 来源:发表于2020-10-05 14:51 被阅读0次

    几种常见SQL:

    共享锁 select * from user WHERE id=1 LOCK IN SHARE MODE

    排他锁 SELECT * FROM user WHERE id=1 FOR UPDATE

    强制走某个索引 SELECT * FROM user FORCE INDEX(idx)

    强制禁用索引 SELECT * FROM user IGNORE INDEX(idx)

    禁用缓存 SELECT SQL_NO_CACHE FROM user;

    优化思路:

    1、查看slowlog,分析slowlog,分析出查询慢的语句。

    2、按照一定优先级,进行一个一个的排查所有慢语句。

    3、分析top sql,进行explain调试,查看语句执行时间。

    4、调整索引或语句本身。

    mysql explain字段含义

    (1) id

    MySQL选定的执行计划中查询的序列号。如果语句里没有子查询等情况,那么整个输出里就只有一个SELECT,这样一来每一行在这个列上都会显示一个1。如果语句中使用了子查询、集合操作、临时表等情况,会给ID列带来很大的复杂性。

    (2) select_type

    语句所使用的查询类型。是简单SELECT还是复杂SELECT(如果是后者,显示它属于哪一种复杂类型)。常用有以下几种标记类型。

    DEPENDENT SUBQUERY:子查询内层的第一个SELECT,依赖于外部查询的结果集。

    DEPENDENT UNION:子查询中的UNION,且为UNION中从第二个SELECT开始的后面所有SELECT,同样依赖于外部查询的结果集。

    PRIMARY:子查询中的最外层查询,注意并不是主键查询。

    SIMPLE:除子查询或UNION之外的其他查询。

    SUBQUERY:子查询内层查询的第一个SELECT,结果不依赖于外部查询结果集。

    UNCACHEABLE SUBQUERY:结果集无法缓存的子查询。

    UNION:UNION语句中的第二个SELECT开始后面的所有SELECT,第一个SELECT为PRIMARY。

    UNION RESULT:UNION中的合并结果。从UNION临时表获取结果的SELECT。

    DERIVED:衍生表查询(FROM子句中的子查询)。MySQL会递归执行这些子查询,把结果放在临时表里。在内部,服务器就把当做一个"衍生表"那样来引用,因为临时表就是源自子查询。

    (3) table

    这一步所访问的数据库中表的名称或者SQL语句指定的一个别名表。这个值可能是表名、表的别名或者一个为查询产生的临时表的标识符,如派生表、子查询或集合。

    (4) type

    表的访问方式。以下列出了各种不同类型的表连接,依次是从最好的到最差的。

    system:系统表,表只有一行记录。这是const表连接类型的一个特例。

    const:读常量,最多只有一行匹配的记录。由于只有一行记录,优化程序里该行记录的字段值可以被当作是一个恒定值。const用于在和PRIMARY KEY或UNIQUE索引中有固定值比较的情形。

    eq_ref:最多只会有一条匹配结果,一般是通过主键或唯一键索引来访问。从该表中会有一行记录被读取出来以和从前一个表中读取出来的记录做联合。与const类型不同的是,这是最好的连接类型。它用在索引所有部分都用于做连接并且这个索引是一个PRIMARY KEY或UNIQUE类型。eq_ref可以用于在进行"="做比较时检索字段。比较的值可以是固定值或者是表达式,表达示中可以使用表里的字段,它们在读表之前已经准备好了。

    ref:JOIN语句中驱动表索引引用的查询。该表中所有符合检索值的记录都会被取出来和从上一个表中取出来的记录作联合。ref用于连接程序使用键的最左前缀或者是该键不是PRIMARY KEY或UNIQUE索引(换句话说,就是连接程序无法根据键值只取得一条记录)的情况。当根据键值只查询到少数几条匹配的记录时,这就是一个不错的连接类型。ref还可以用于检索字段使用"="操作符来比较的时候。

    ref_or_null:与ref的唯一区别就是在使用索引引用的查询之外再增加一个空值的查询。这种连接类型类似ref,不同的是MySQL会在检索的时候额外的搜索包含NULL值的记录。这种连接类型的优化是从MySQL 4.1.1开始的,它经常用于子查询。

    index_merge:查询中同时使用两个(或更多)索引,然后对索引结果进行合并(merge),再读取表数据。这种连接类型意味着使用了Index Merge优化方法。

    unique_subquery:子查询中的返回结果字段组合是主键或唯一约束。

    index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或唯一索引。这种连接类型类似unique_subquery。它用子查询来代替IN,不过它用于在子查询中没有唯一索引的情况下。

    range:索引范围扫描。只有在给定范围的记录才会被取出来,利用索引来取得一条记录。

    index:全索引扫描。连接类型跟ALL一样,不同的是它只扫描索引树。它通常会比ALL快点,因为索引文件通常比数据文件小。MySQL在查询的字段知识单独的索引的一部分的情况下使用这种连接类型。

    fulltext:全文索引扫描。

    all:全表扫描。

    (5) possible_keys

    该字段是指MySQL在搜索表记录时可能使用哪个索引。如果没有任何索引可以使用,就会显示为null。

    (6) key

    查询优化器从possible_keys中所选择使用的索引。key字段显示了MySQL实际上要用的索引。当没有任何索引被用到的时候,这个字段的值就是NULL。

    (7) key_len

    被选中使用索引的索引键长度。key_len字段显示了MySQL使用索引的长度。当key字段的值为NULL时,索引的长度就是NULL。

    (8) ref

    列出是通过常量,还是某个表的某个字段来过滤的。ref字段显示了哪些字段或者常量被用来和key配合从表中查询记录出来。

    (9) rows

    该字段显示了查询优化器通过系统收集的统计信息估算出来的结果集记录条数。

    (10) Extra

    该字段显示了查询中MySQL的附加信息。

    ICP特性:Index Condition Pushdown (ICP)是mysql使用索引从表中检索行数据的一种优化方式,如果WHERE条件可以使用索引,MySQL 会把这部分过滤操作放到存储引擎层,存储引擎通过索引过滤,把满足的行从表中读取出。ICP能减少引擎层访问基表的次数和 Server层访问存储引擎的次数。(explain后extra会提示Using index condition)

    MRR特性:MRR的全称是Multi-Range Read Optimization,是优化器将随机IO转化为顺序IO以降低查询过程中IO开销的一种手段,这对IO-bound类型的SQL语句性能带来极大的提升,适用于range ref eq_ref类型的查询(explain后extra会提示Using MRR)

    BKA特性:Batched Key Access (BKA)  提高表join性能的算法。当被join的表能够使用索引时,就先排好顺序,然后再去检索被join的表,听起来和MRR类似,实际上MRR也可以想象成二级索引和 primary key的join。(BAK使用了MRR,要想使用BAK必须打开MRR功能)

    (11) filtered

    这个列式在MySQL5.1里新加进去的,当使用EXPLAIN EXTENDED时才会出现。它显示的是针对表里符合某个条件(WHERE子句或联接条件)的记录数的百分比所作的一个悲观估算。

    相关文章

      网友评论

          本文标题:mysql优化方式

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