zoukankan      html  css  js  c++  java
  • MySql数据库慢查询

    一、什么是数据库慢查询?

    数据库慢查询,就是查询时间超过了我们设定的时间的语句。

    可以查看设定的时间:

     默认的设定时间是10秒。也可以自己根据实际项目设定。 

    set long_query_time=0.0001;

    二、MySQL 慢查询的相关参数解释:

    slow_query_log :是否开启慢查询日志,1表示开启,0表示关闭。

    log-slow-queries :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log

    slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log

    long_query_time :慢查询阈值,当查询时间多于设定的阈值时,记录日志。

    log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。

    log_output:日志存储方式。log_output='FILE'表示将日志存入文件,默认值是'FILE'。log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql

    慢查询日志配置:

    默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,可以通过设置slow_query_log的值来开启,如下所示:

    show variables like 'slow_query%'; -- 慢查询

    show variables like 'long_query_time'; -- 查询时间设置

    show variables like '%slow_query_log%';-- 查看慢查询的日志配置

    SET GLOBAL slow_query_log = 'ON'; ---开启慢查询日志

    show variables like 'log_queries_not_using_indexes'; --查看未使用索引的

    set global log_queries_not_using_indexes=1; -- 未使用索引的查询也被记录到慢查询日志中

    show global status like '%slow_queries%';-- 查询慢查询记录

    三、最大连接数的查看与设置

    -- 1、查看最大连接数

    show variables like '%max_connections%'; -- 上限连接数

    SHOW GLOBAL STATUS LIKE 'Max_used_connections' -- 服务响应的最大连接数

    比较理想的设置:Max_used_connections / max_connections * 100% ≈ 85%
    最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接数上限设置的过高了。

    -- 2、修改最大连接数
    set GLOBAL max_connections = 500;

    -- 列出MySQL服务器运行各种状态值
    SHOW GLOBAL STATUS;

    四、常见的慢查询优化

    1、索引没起到作用的情况

    1)、使用LIKE关键字的查询语句        在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引不会起作用。只有“%”不在第一个位置索引才会起作用。

    2)、 使用多列索引的查询语句        MySQL可以为多个字段创建索引。一个索引最多可以包括16个字段。对于多列索引,只有查询条件使用了这些字段中的第一个字段时,索引才会被使用。

    2、优化数据库结构

    1)、将字段很多的表拆解成多个表

    2)、设置中间表

    3、分解关联查询

    很多高性能的应用都会对关联查询进行分解,就是可以对每一个表进行一次单表查询,然后将查询结果在应用程序中进行关联,很多场景下这样会更高效。

    4、优化limit分页

      在系统中需要分页的操作通常会使用limit加上偏移量的方法实现,同时加上合适的order by 子句。如果有对应的索引,通常效率会不错,否则MySQL需要做大量的文件排序操作。

          一个非常令人头疼问题就是当偏移量非常大的时候,例如可能是limit 10000,20这样的查询,这是mysql需要查询10020条然后只返回最后20条,前面的10000条记录都将被舍弃,这样的代价很高。

            优化此类查询的一个最简单的方法是尽可能的使用索引覆盖扫描,而不是查询所有的列。然后根据需要做一次关联操作再返回所需的列。对于偏移量很大的时候这样做的效率会得到很大提升。

  • 相关阅读:
    女程序员发的一条微博
    【转】Android中JNI的使用方法
    【转】浏览器~加载,解析,渲染
    【转】PHP简单拦截器的实现
    【转】jQuery选择器总结
    【转】JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)
    【转】JSONP跨域的原理解析
    utuntu16.04安装tensorflow1.4-gpu
    Kaggle-Digit Recognizer
    python 常见细节知识点
  • 原文地址:https://www.cnblogs.com/jane4321/p/11607719.html
Copyright © 2011-2022 走看看