sql的性能分析

慢查询日志:通过慢查询日志需要优化的sql语句。

  • 慢查询日志记录了所有执行时间超过指定参数的所有sql语句。

  • 开启慢日志查询开关:show_query_log=1

  • 设置慢查询日志的时间:long_query_time=?。

  • show variables like 'slow_query_log';查看慢查询日志是否开启。

  • 慢查询开启之后会在本地身材个好难过localhost-show.log文件

profile详情:可以再做sql优化的时候帮助我们了解时间都耗费到哪里了通过have_profiling来查看是否支持

  • profile帮我们解决了在使用慢查询日志的时候,一些简单的sql语句压秒结束的操作,让我们能够进行优化操作。

    复制代码
    select  @@have_profiling    //查看是否支持profile
    select @@profiling          //查看是否打开。
    set profiling = 1           //将其进行打开
    ​
    show profiles               //打开profile之后展示在当前操作下sql语句的执行时间。
    show profile for query 【字段id】   //查看sql语句各个阶段的耗时时间。
    show profile cpu for query 【id】     //查看指定id的sql语句cpu的使用情况。

explain:查看当前语句的执行计划,只需要在sql语句前面加上即可。

  • explain各个字段:

    • id: 表示查询的顺序,其中的id越大,执行的优先级也就越大,同样的id通过从上到下的顺序来进行执行。

    • select_type:知识说明查询的类型

      • 常见的取值有simple,primary,union,subouery。
    • type:表示连接类型,性能由号道岔的连接类型为Null,system,const,eq_ref,ref,range,index,all。

    • possible_key:显示可能用到的索引

    • key:实际用到的索引

    • key_len:表示索引当中没奶奶个的单子结束,该值为索引字段的最大可能长度

    • rows:mysql认为需要执行的查询行数,这是一个估计值。

    • filtered:表示返回结果所占读取行数的百分比,filtered的值越大越好。

    • extra:前文没有显示出来的东西会在extra里面显示出来。

索引的使用:

  • 最左前缀法则:表中的最左侧的字段必须存在,查询从索引的最左列开始,并且不跳过索引中的列,如果跳过,索引将部分失效(后面的字段索引失效)。

  • 范围查询:联合索引当中,出现范围查询(加上等号不会失效),其右边的字段的索引将会失效。

  • 索引列的任何计算都会失效,性能降低!!

  • 字符串类型的字段如果不加引号,索引会失效。

  • 模糊查询:如果是尾部进行查询,索引不会失效,如果是头部模糊那么索引就会失效。

  • or连接的条件,如果or连接的字段有一方没有索引,那么全部索引都会失效。

  • 数据分布影响:如果mysql执行sql语句的时候评估全表扫描比索引查找效率更高,那么就会走全表扫描。

  • sql提示:在sql语句当中加入一些人为的提示来达到优化操作的目的。

复制代码
```
select * from table use index(索引名) where 条件。            建议使用某一个索引
select * from table  ignore index(索引名) where 条件。        忽略某一个索引
select * from table force index(索引名) where 条件。          强制使用某一个索引
```
  • 覆盖索引:查询使用了索引,并且返回需要的列,在该索引当中已经全部找到,减少select *的使用。

    复制代码
    using index condition 查找使用了所以呢,但是需要返回表查询数据
    using where using index 查找使用了索引,但是需要的数据都在索引列当中都能找到,所以不需要会标查询数据
    • 覆盖索引就是说明在sql语句查询的时候,不需要再次回表,只需要在二级索引下就能够找到语句需要返回的字段,这就是所谓的覆盖索引
  • 前缀索引:当字段类型为字符串的时候,设置索引就会很长,索引,我们可以使用前缀索引,取得字符串的前n个字段来提高索引的效率。前缀的长度是选择性的,索引选择性索引值和数据表中的记录总数的比值,索引选择性越高,那么查询的效率也就越高。

    复制代码
    - create  index index_name on table(column(n))  根据 column的前n个字符来创建索引,
    - select count(distinct substring(column,1,n)) from table       查看选取字段所占的比值。

索引的设计原则:

  • 针对数量非常大的,查询比较频繁的。

  • 针对查询条件,排序,分组操作的字段建立索引。

  • 尽量选择区分度高的列作为索引,尽量建立唯一索引。

  • 对于字符串类型的字段,字段的长度较长,可以针对于字段的特点,简历前缀索引。

  • 尽量使用联合索引,减少单列索引,查询时联合索引很多时可以覆盖索引,节省空间。

  • 要控制索引数量,索引并不是越多越好,维护索引结构的代价也会越来越大。

  • 如果索引不能存null值,请在穿件表示使用not null约束它。

相关推荐
数据库小组4 小时前
2026 年,MySQL 到 SelectDB 同步为何更关注实时、可观测与可校验?
数据库·mysql·数据库管理工具·数据同步·ninedata·selectdb·迁移工具
华科易迅4 小时前
MybatisPlus增删改查操作
android·java·数据库
Kethy__4 小时前
计算机中级-数据库系统工程师-计算机体系结构与存储系统
大数据·数据库·数据库系统工程师·计算机中级
SHoM SSER4 小时前
MySQL 数据库连接池爆满问题排查与解决
android·数据库·mysql
熬夜的咕噜猫5 小时前
MySQL备份与恢复
数据库·oracle
jnrjian5 小时前
recover database using backup controlfile until cancel 假recover,真一致
数据库·oracle
lifewange5 小时前
java连接Mysql数据库
java·数据库·mysql
大妮哟6 小时前
postgresql数据库日志量异常原因排查
数据库·postgresql·oracle
还是做不到嘛\.7 小时前
Dvwa靶场-SQL Injection (Blind)-基于sqlmap
数据库·sql·web安全
不写八个7 小时前
PHP教程004:php链接mysql数据库
数据库·mysql·php