精华内容
下载资源
问答
  • 主要介绍了MySql批量插入优化Sql执行效率实例详解的相关资料,需要的朋友可以参考下
  • MySQL查看SQL语句执行效率

    万次阅读 2013-04-08 13:22:30
    SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。 Explain语法:explain select … from … [where ...] 例如:explain select * from news; 输出:
    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 
     SQL 
    语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。 
    

    Explain语法:explain select … from … [where ...]

    例如:explain select * from news;

    输出:

    +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+

    下面对各个属性进行了解:

    1、id:这是SELECT的查询序列号

    2、select_type:select_type就是select的类型,可以有以下几种:

    SIMPLE:简单SELECT(不使用UNION或子查询等)

    PRIMARY:最外面的SELECT

    UNION:UNION中的第二个或后面的SELECT语句

    DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询

    UNION RESULT:UNION的结果。

    SUBQUERY:子查询中的第一个SELECT

    DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询

    DERIVED:导出表的SELECT(FROM子句的子查询)


    3、table:显示这一行的数据是关于哪张表的

    4、type:这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一。

    结果值从好到坏依次是:

    system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

    一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。

    5、possible_keys:列指出MySQL能使用哪个索引在该表中找到行

    6、key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL

    7、key_len:显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好

    8、ref:显示使用哪个列或常数与key一起从表中选择行。

    9、rows:显示MySQL认为它执行查询时必须检查的行数。

    10、Extra:包含MySQL解决查询的详细信息,也是关键参考项之一。

    Distinct
    一旦MYSQL找到了与行相联合匹配的行,就不再搜索了

    Not exists
    MYSQL 优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,

    就不再搜索了

    Range checked for each

    Record(index map:#)
    没有找到理想的索引,因此对于从前面表中来的每一 个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一

    Using filesort
    看 到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来 排序全部行

    Using index
    列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表 的全部的请求列都是同一个索引的部分的时候

    Using temporary
    看到这个的时候,查询需要优化了。这 里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上

    Using where
    使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index, 这就会发生,或者是查询有问题

    其他一些Tip:

    1. 当type 显示为 “index” 时,并且Extra显示为“Using Index”, 表明使用了覆盖索引。 
    展开全文
  • 查询结果:{  "query_block": {  "select_id": 1,  "cost_info": {  "query_cost": "8.42"  },  "table": {  "table_name": "td",  "access_type": "range", ... "possible_keys
    查询结果:{
    
      "query_block": {
        "select_id": 1,
        "cost_info": {
          "query_cost": "8.42"
        },
        "table": {
          "table_name": "td",
          "access_type": "range",
          "possible_keys": [
            "PRIMARY"
          ],
          "key": "PRIMARY",
          "used_key_parts": [
            "id"
          ],
          "key_length": "4",
          "rows_examined_per_scan": 6,
          "rows_produced_per_join": 6,
          "filtered": "100.00",
          "cost_info": {
            "read_cost": "7.22",
            "eval_cost": "1.20",
            "prefix_cost": "8.42",
            "data_read_per_join": "1K"
          },
          "used_columns": [
            "id",
            "name"
          ],
          "attached_condition": "(`gourd`.`td`.`id` in (1,2,3,4,5,6))"
        }
      }

    }


    query_cost:查询花费的成本

    access_type:用到哪种类型的索引

    其他的就不一一解释了。

    展开全文
  • Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。...

    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。


    Explain语法:explain select … from … [where ...]


    例如:explain select * from news;


    输出:


    +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+

    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

    +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+


    下面对各个属性进行了解:


    1、id:这是SELECT的查询序列号


    2、select_type:select_type就是select的类型,可以有以下几种:



    SIMPLE:简单SELECT(不使用UNION或子查询等)


    PRIMARY:最外面的SELECT


    UNION:UNION中的第二个或后面的SELECT语句


    DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询


    UNION RESULT:UNION的结果。


    SUBQUERY:子查询中的第一个SELECT


    DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询


    DERIVED:导出表的SELECT(FROM子句的子查询)



    3、table:显示这一行的数据是关于哪张表的


    4、type:这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一。


    结果值从好到坏依次是:


    system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL


    一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。


    5、possible_keys:列指出MySQL能使用哪个索引在该表中找到行


    6、key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL


    7、key_len:显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好


    8、ref:显示使用哪个列或常数与key一起从表中选择行。


    9、rows:显示MySQL认为它执行查询时必须检查的行数。


    10、Extra:包含MySQL解决查询的详细信息,也是关键参考项之一。



    Distinct

    一旦MYSQL找到了与行相联合匹配的行,就不再搜索了

    Not exists

    MYSQL 优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,

    就不再搜索了

    Range checked for each

    Record(index map:#)

    没有找到理想的索引,因此对于从前面表中来的每一 个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一

    Using filesort

    看 到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来 排序全部行

    Using index


    列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表 的全部的请求列都是同一个索引的部分的时候


    Using temporary

    看到这个的时候,查询需要优化了。这 里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上

    Using where使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index, 这就会发生,或者是查询有问题








    ​mysql几种性能测试的工具使用

    一、mysqlslap

        安装:装了mysql就有了
        作用:模拟并发测试数据库性能。
        优点:简单,容易使用。
        不足:不能指定生成的数据规模,测试过程不清楚针对十万级还是百万级数据做的测试,感觉不太适合做综合测试,比较适合针对既有数据库,对单个sql进行优化的测试。
        使用方法:
        可以使用mysqlslap --help来显示使用方法:

         Default options are read from the following files in the given order:

         /etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf

         --engines:代表要测试的引擎,可以有多个,用分隔符隔开。

         --iterations:代表要运行这些测试多少次。

         --auto-generate-sql :代表用系统自己生成的SQL脚本来测试。

         --auto-generate-sql-load-type: 代表要测试的是读还是写还是两者混合的(read,write,update,mixed)

         --number-of-queries:代表总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算。

        --debug-info 代表要额外输出CPU以及内存的相关信息。

        --number-int-cols :创建测试表的 int 型字段数量

        --auto-generate-sql-add-autoincrement : 代表对生成的表自动添加auto_increment列,从5.1.18版本开始

        --number-char-cols 创建测试表的 char 型字段数量。

        --create-schema 测试的schema,MySQL中schema也就是database。

        --query  使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。

        --only-print 如果只想打印看看SQL语句是什么,可以用这个选项。

        mysqlslap -u root -p --concurrency=100 --iterations=1 --auto-generate-sql --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --engine=myisam --number-of-queries=10

    或:
        指定数据库和sql语句:

        mysqlslap -h localhost -P 123456 --concurrency=100 --iterations=1 --create-schema='mysql' --query='select * from user;' --number-of-queries=10 -u root -p

        要是看到底做了什么可以加上:--only-print
    Benchmark
            Average number of seconds to run all queries: 25.225 seconds
            Minimum number of seconds to run all queries: 25.225 seconds
            Maximum number of seconds to run all queries: 25.225 seconds
            Number of clients running queries: 100
            Average number of queries per client: 0

        以上表明100个客户端同时运行要25秒

        再如:

        mysqlslap -uroot -p123456 --concurrency=100 --iterations=1 --engine=myisam --create-schema='haodingdan112' --query='select *  From order_boxing_transit where id = 10' --number-of-queries=1 --debug-info

    二、sysbench 

    安装:
        可以从http://sourceforge.net/projects/sysbench/ 下载
        tar zxf sysbench-0.4.12.tar.gz
        cd sysbench-0.4.12
        ./autogen.sh
        ./configure && make && make install

        strip /usr/local/bin/sysbench

        安装时候可能会报错,后来baidu发现个好文 http://blog.csdn.net/icelemon1314/article/details/7004955 怕以后找不到,也贴过来吧

        1.如果mysql不是默认路径安装,那么需要通过指定--with-mysql-includes和--with-mysql-libs参数来加载mysql安装路径

    2.如果报错:
        ../libtool: line 838: X--tag=CC: command not found
        ../libtool: line 871: libtool: ignoring unknown tag : command not found
        ../libtool: line 838: X--mode=link: command not found
        ../libtool: line 1004: *** Warning: inferring the mode of operation is deprecated.: command not found
        ../libtool: line 1005: *** Future versions of Libtool will require --mode=MODE be specified.: command not found
        ../libtool: line 2231: X-g: command not found
        ../libtool: line 2231: X-O2: command not found
        那么执行下根目录的:autogen.sh文件,然后重新configure && make && make install

    3.如果报错:
        sysbench: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory

        那么执行下:
        ln -s /usr/local/mysql5.5/mysql/lib/libmysqlclient.so.18 /usr/lib64/

    4.如果执行autogen.sh时,报如下错误:
        ./autogen.sh: line 3: aclocal: command not found
        那么需要安装一个软件:
        yum install automake
        然后需要增加一个参数:查找: AC_PROG_LIBTOOL 将其注释,然后增加AC_PROG_RANLIB 
        作用:模拟并发,可以执行CPU/内存/线程/IO/数据库等方面的性能测试。数据库目前支持MySQL/Oracle/PostgreSQL
        优点:可以指定测试数据的规模,可以单独测试读、写的性能,也可以测试读写混合的性能。
        不足:测试的时候,由于网络原因,测试的非常慢,但是最终给的结果却很好,并发支持很高,所以给我的感觉是并不太准确。当然也可能我没搞明白原理

    使用方法:
        准备数据 
        sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=400000 --mysql-db=dbtest2 --mysql-user=root --mysql-host=192.168.1.101 --mysql-password=pwd prepare


    执行测试
        sysbench --num-threads=100 --max-requests=4000 --test=oltp --mysql-table-engine=innodb --oltp-table-size=400000 --mysql-db=dbtest1 --mysql-user=root --mysql-host=192.168.1.101 --mysql-password=pwd run 

        sysbench 0.4.12: multi-threaded system evaluation benchmark
        No DB drivers specified, using mysql
        Running the test with following options:
        Number of threads: 100
        Doing OLTP test.
        Running mixed OLTP test
        Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases)
        Using "BEGIN" for starting transactions
        Using auto_inc on the id column
        Maximum number of requests for OLTP test is limited to 4000
        Threads started!
        Done.
        OLTP test statistics:
        queries performed:
        read: 56014
        write: 20005
        other: 8002
        total: 84021
        transactions: 4001 (259.14 per sec.)
        deadlocks: 0 (0.00 per sec.)
        read/write requests: 76019 (4923.75 per sec.)
        other operations: 8002 (518.29 per sec.)
        Test execution summary:
        total time: 15.4393s
        total number of events: 4001
        total time taken by event execution: 1504.7744
        per-request statistics:
        min: 33.45ms
        avg: 376.10ms
        max: 861.53ms
        approx. 95 percentile: 505.65ms
        Threads fairness:
        events (avg/stddev): 40.0100/0.67
        execution time (avg/stddev): 15.0477/0.22


    三、tpcc-mysql 

        安装:
        export C_INCLUDE_PATH=/usr/include/mysql
        export PATH=/usr/bin:$PATH
        export LD_LIBRARY_PATH=/usr/lib/mysql
        cd /tmp/tpcc/src
        make 
        然后就会在 /tmp/tpcc-mysql 下生成 tpcc 命令行工具 tpcc_load 、 tpcc_start

        作用:测试mysql数据库的整体性能
        优点:符合tpcc标准,有标准的方法,模拟真实的交易活动,结果比较可靠。
        不足:不能单独测试读或者写的性能,对于一些以查询为主或者只写的应用,就没有这么大的意义了。
        使用方法:
        加载数据
        创建库
        mysql>create database tpcc10;
        创建表:
        shell>mysql tpcc10 < create_table.sql
        添加外键:
        shell>mysql tpcc10 < add_fkey_idx.sql

        加载数据:

    1、单进程加载:
        shell>./tpcc_load 192.168.11.172 tpcc10 root pwd 300
        |主机||数据库||用户||密码||warehouse|

    2、并发加载:(推荐,但需要修改一下)

        shell>./load.sh tpcc300 300
        |数据库||warehouse|

    3、测试
        ./tpcc_start -h192.168.11.172 -d tpcc -u root -p 'pwd' -w 10 -c 10 -r 10 -l 60 -i 10 -f /mnt/hgfs/mysql/tpcc100_2013522.txt
        ***************************************
        *** ###easy### TPC-C Load Generator ***
        ***************************************
        option h with value '192.168.11.172'
        option d with value 'tpcc'
        option u with value 'root'
        option p with value 'pwd'
        option w with value '1'
        option c with value '100'
        option r with value '120'
        option l with value '60'
        option i with value '10'
        option f with value '/mnt/hgfs/mysql/tpcc100_2013522.txt'
        <Parameters>
        [server]: 192.168.11.172
        [port]: 3306
        [DBname]: tpcc
        [user]: root
        [pass]: pwd
        [warehouse]: 1
        [connection]: 100
        [rampup]: 120 (sec.)
        [measure]: 60 (sec.)
        RAMP-UP TIME.(120 sec.)
        MEASURING START.
        10, 245(77):10.923|28.902, 242(0):3.677|10.796, 25(0):1.579|2.198, 24(0):17.451|21.047, 25(4):19.999|33.776
        20, 262(75):9.070|11.917, 263(0):3.407|4.716, 26(0):1.608|1.776, 27(0):11.347|16.408, 26(1):19.166|21.018
        30, 247(90):11.130|14.131, 241(0):2.367|2.654, 24(0):0.960|1.095, 24(0):9.308|16.538, 25(3):19.999|24.874
        40, 237(69):11.840|13.009, 239(1):3.638|7.245, 24(0):0.692|0.773, 23(0):8.756|10.456, 23(1):19.527|20.495
        50, 252(69):10.548|17.925, 256(0):2.652|2.893, 26(0):1.177|3.579, 27(0):14.648|15.018, 25(4):19.999|26.398
        60, 256(78):9.323|11.328, 251(1):3.895|5.380, 25(0):0.785|1.542, 25(0):11.382|15.829, 26(0):18.481|18.855
        STOPPING THREADS....................................................................................................
        <Raw Results>
        [0] sc:1041 lt:458 rt:0 fl:0 
        [1] sc:1490 lt:2 rt:0 fl:0 
        [2] sc:150 lt:0 rt:0 fl:0 
        [3] sc:150 lt:0 rt:0 fl:0 
        [4] sc:137 lt:13 rt:0 fl:0 
        in 60 sec.
        <Raw Results2(sum ver.)>
        [0] sc:1041 lt:458 rt:0 fl:0 
        [1] sc:1490 lt:2 rt:0 fl:0 
        [2] sc:150 lt:0 rt:0 fl:0 
        [3] sc:150 lt:0 rt:0 fl:0 
        [4] sc:137 lt:13 rt:0 fl:0 
        <Constraint Check> (all must be [OK])
        [transaction percentage]
        Payment: 43.36% (>=43.0%) [OK]
        Order-Status: 4.36% (>= 4.0%) [OK]
        Delivery: 4.36% (>= 4.0%) [OK]
        Stock-Level: 4.36% (>= 4.0%) [OK]
        [response time (at least 90% passed)]
        New-Order: 69.45% [NG] *
        Payment: 99.87% [OK]
        Order-Status: 100.00% [OK]
        Delivery: 100.00% [OK]
        Stock-Level: 91.33% [OK]
        <TpmC>
        1499.000 TpmC
        关于Tpcc的概念请参见http://baike.baidu.com/view/2776305.htm 
        这里把测试用例介绍贴一下
        TPC-C测试用到的模型是一个大型的商品批发销售公司,它拥有若干个分布在不同区域的商品仓库。当业务扩展的时候,公司将添加新的仓库。
        每个仓库负责为10个销售点供货,其中每个销售点为3000个客户提供服务,每个客户提交的订单中,平均每个订单有10项产品,
        所有订单中约1%的产品在其直接所属的仓库中没有存货,必须由其他区域的仓库来供货。同时,每个仓库都要维护公司销售的100000种商品的库存记录。

    四、 The MySQL Benchmark Suite
            这个测试工具是随着MySQL绑定发行的,基于Perl语言和其中的两个模块:DBI和Benchmark。如果有需要,它支持所有支持DBI驱动的数据库。可以通过修改bench-init.pl的选项以符合需要。另外提醒的是,它不支持多CPU。
            进行测试时,执行run-all-tests脚本,具体的命令选项请看README。
    五、 MySQL super-smack
           这是一个强大的广受赞誉的压力测试工具,支持MySQL和PostgreSQL。
           http://jeremy.zawodny.com/mysql/super-smack/
          安装很简单,请先仔细阅读目录里的指导文件。
           Preparing test data
           做测试时,最好用自己的数据。因为使用真实的数据,使测试变得接近现实和客观。
          Configuration
          smack的文件设置,看起来很简单。
     
    六、MyBench: A Home-Grown Solution
          MyBench一种基于Perl语言易于扩展的测试工具。




    展开全文
  • mysql中explain查看sql语句执行效率

    千次阅读 2016-12-27 14:54:45
    explain显示了MySQL如何使用索引来处理select语句以及...这个不重要,查询序号即为sql语句执行的顺序 select_type select类型,它有以下几种值  simple 它表示简单的select,没有union和子查询  primary 最外面的sel

    explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。


    explain列的解释
    table:显示这一行的数据是关于哪张表的

    type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和all

    possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从where语句中选择一个合适的语句

    key: 实际使用的索引。如果为null,则没有使用索引。很少的情况下,mysql会选择优化不足的索引。这种情况下,可以在select语句中使用use index(indexname)来强制使用一个索引或者用ignore index(indexname)来强制mysql忽略索引

    key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好

    ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

    rows:mysql认为必须检查的用来返回请求数据的行数

    extra:关于mysql如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是using temporary和using filesort,意思mysql根本不能使用索引,结果是检索会很慢


    extra列返回的描述的意义

    distinct:一旦mysql找到了与行相联合匹配的行,就不再搜索了

    not exists: mysql优化了left join,一旦它找到了匹配left join标准的行,就不再搜索了

    range checked for each record(index map:#):没有找到理想的索引,因此对于从前面表中来的每一个行组合,mysql检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一

    using filesort: 看到这个的时候,查询就需要优化了。mysql需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行

    using index: 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候

    using temporary 看到这个的时候,查询需要优化了。这里,mysql需要创建一个临时表来存储结果,这通常发生在对不同的列集进行order by上,而不是group by上

    where used 使用了where从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型all或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)

    system 表只有一行:system表。这是const连接类型的特殊情况

    const:表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为mysql先读这个值然后把它当做常数来对待

    eq_ref:在连接中,mysql在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用

    ref:这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好

    range:这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况

    index: 这个连接类型对前面的表中的每一个记录联合进行完全扫描(比all更好,因为索引一般小于表数据)

    all:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免


    id

    SELECT识别符。这是SELECT查询序列号。这个不重要,查询序号即为sql语句执行的顺序

    select_type

    select类型,它有以下几种值

     simple 它表示简单的select,没有union和子查询

     primary 最外面的select,在有子查询的语句中,最外面的select查询就是primary,上图中就是这样

     union union语句的第二个或者说是后面那一个.现执行一条语句,explain
    select * from uchome_space limit 10 union select * from uchome_space limit 10,10

    会有如下结果

    第二条语句使用了union

     dependent union    UNION中的第二个或后面的SELECT语句,取决于外面的查询

     union result        UNION的结果,如上面所示

    还有几个参数,这里就不说了,不重要

     table

    输出的行所用的表,这个参数显而易见,容易理解

     type

    连接类型。有多个参数,先从最佳类型到最差类型介绍 重要且困难

    system 表仅有一行,这是const类型的特列,平时不会出现,这个也可以忽略不计

    const 表最多有一个匹配行,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快

    记住一定是用到primary key 或者unique,并且只检索出两条数据的 情况下才会是const,看下面这条语句

    explain SELECT * FROM `asj_admin_log` limit 1,结果是

    虽然只搜索一条数据,但是因为没有用到指定的索引,所以不会使用const.继续看下面这个

    explain SELECT * FROM `asj_admin_log` where log_id = 111

    log_id是主键,所以使用了const。所以说可以理解为const是最优化的

    eq_ref 对于eq_ref的解释,mysql手册是这样说的:"对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY"。eq_ref可以用于使用=比较带索引的列。看下面的语句

    explain select * from uchome_spacefield,uchome_space where uchome_spacefield.uid = uchome_space.uid

    得到的结果是下图所示。很明显,mysql使用eq_ref联接来处理uchome_space表。

    目前的疑问:

     为什么是只有uchome_space一个表用到了eq_ref,并且sql语句如果变成

           explain select * from uchome_space,uchome_spacefield where uchome_space.uid = uchome_spacefield.uid

           结果还是一样,需要说明的是uid在这两个表中都是primary

    ref  对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀,或如果键不是UNIQUE或PRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。

    看下面这条语句 explain select * from uchome_space where uchome_space.friendnum = 0,得到结果如下,这条语句能搜出1w条数据


    ref_or_null 该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。

    上面这五种情况都是很理想的索引使用情况

    index_merge 该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。

     unique_subquery 是一个索引查找类型,可以完全替换子查询,效率更高。

    index_subquery该联接类型类似于unique_subquery,不过索引类型不需要是唯一索引,可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引:

    range 给定范围内的检索,使用一个索引来检查行。看下面两条语句

    explain select * from uchome_space where uid in (1,2)

    explain select * from uchome_space where groupid in (1,2)

    uid有索引,groupid没有索引,结果是第一条语句的联接类型是range,第二个是ALL.以为是一定范围所以说像 between也可以这种联接,很明显

    explain select * from uchome_space where friendnum = 17

    这样的语句是不会使用range的,它会使用更好的联接类型就是上面介绍的ref

     index     该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)

    当查询只使用作为单索引一部分的列时,MySQL可以使用该联接类型。

    ALL  对于每个来自于先前的表的行组合,进行完整的表扫描。如果表是第一个没标记const的表,这通常不好,并且通常在它情况下差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值或列值被检索出。

    possible_keys 提示使用哪个索引会在该表中找到行,不太重要

    keys MYSQL使用的索引,简单且重要

    key_len MYSQL使用的索引长度

    ref   ref列显示使用哪个列或常数与key一起从表中选择行。

    rows 显示MYSQL执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引

    Extra  该列包含MySQL解决查询的详细信息。

    Distinct    MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。一直没见过这个值

    Not exists 

     range checked for each record没有找到合适的索引

    using filesort    MYSQL手册是这么解释的“MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。然后关键字被排序,并按排序顺序检索行。”目前不太明白

     using index 只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的信息。这个比较容易理解,就是说明是否使用了索引

    explain select * from ucspace_uchome where uid = 1的extra为using index(uid建有索引)

    explain select count(*) from uchome_space where groupid=1 的extra为using where(groupid未建立索引)

     using temporary为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。

    出现using temporary就说明语句需要优化了



    展开全文
  • 【0】如何分析mysqlsql执行较慢的问题 步骤1、观察,至少跑一天,看看生产的慢sql情况; 步骤2、开启慢查询日志,设置阈值,比如超过5秒钟就是慢sql, 并将它抓取出来; 步骤3、explain+慢sql分析; 步骤4、...
  • Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。...
  • 根据mysql慢日志监控SQL语句执行效率 启用MySQL的log-slow-queries(慢查询记录)。
  • 查询mysql执行效率低的sql语句的方法,需要的朋友可以参考一下
  • MySql批量插入优化Sql执行效率

    千次阅读 2016-06-19 10:54:28
    itemcontractprice数量1万左右,每条...用sql语句批量操作,可以说效率提升了 40倍,就是大量数据的传输和数据库的处理次数耗时。 所以说,软件开发不是开发完成就行,而是要解决性能上的问题,这才是开发的进阶。
  • 查看执行时间 1 show profiles; 2 show variables;查看profiling 是否是on状态; 3 如果是off,则 set profiling = 1; 4 执行自己的sql语句; 5 show profiles;就可以查到sql语句的执行时间; 查看操作...
  • 文章目录官方文档某些SQL查询为什么慢MySQL处理SQL请求的过程查询缓存对SQL性能的影响SQL预处理及生成执行计划造成MySQL生成错误的执行计划的原因 官方文档 https://dev.mysql.com/doc/ 如果英文不好的话,可以...
  • MySQL如何查看自己执行SQL花费的时间呢?那就是show profiles。 首先看看你有没有开启这个功能 mysql> show variables like "%prof%"; +------------------------+-------+ | Variable_name | Value | +-------...
  • mysql 分析查找执行效率慢的SQL语句

    万次阅读 2015-11-13 19:11:58
    启动Mysql时加参数--log-slow-queries来记录执行时间超过long_query_time秒的sql MySQL 自带 slow log 的分析工具 mysqldumpslow。 slow log 是 MySQL 根据 SQL 语句的执行时间设定,写入的一个文件,用于分析...
  • mysqlsql执行计划

    千次阅读 2018-09-27 15:14:30
    MySql提供EXPLAIN语法用来进行查询分析,在SQL语句前加一个“EXPLAIN”,例: EXPLAIN SELECT * FROM T_CLASS WHERE CLASS_NAME=&quot;网络工程&quot; 执行结果: 执行结果解释: select_type: 数据库...
  • MySQL中如何查看“慢查询”,如何分析执行SQL效率
  • 查查询询mysql中中执执行行效效率率低低的的sql语语句句的的方方法法 查询mysql执行效率低的sql语句的方法需要的朋友可以参考一下 一些小技巧 1. 如何查出效率低的语句 MySQL下 启动参数中设置 --log-slow-queries...
  • mysqlsql执行计划详解

    千次阅读 2018-06-19 09:02:47
    使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。explain执行计划包含的信息其中最重要的字段为:id、type、key、rows、Extra各...
  • MySQLSQL执行计划分析

    万次阅读 2018-01-09 09:15:30
    MySQL EXPLAIN命令是查询性能优化不可缺少的一部分,该文主要讲解explain命令的使用及相关参数说明。
  • MySQL高级SQL语句

    万次阅读 多人点赞 2021-06-28 15:06:13
    MySQL高级SQL语句MySQL高级SQL语句函数数学函数聚合函数字符串函数 MySQL高级SQL语句 use kgc; create table location (Region char(20),store_name char(20)); insert into location values ('East','Boston') ; ...
  • mysqlsql执行计划explain

    千次阅读 2018-04-10 21:29:40
    引言:实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表、怎样使用索引的,因此,我们能感知到的就只有sql语句运行的时间,在数据规模不大时,查询是瞬间的,因此,在...
  • Mysql 定位执行效率低的SQL语句

    千次阅读 2011-06-14 11:30:00
    在J2EE项目当中,最常见的开发工作就是去查询、更新、删除数据库的操作,一个好的SQL语句可以使应用程序很快的跑起来,反正就变的很...所以就用到下面就要用到下面的方法,在mysql中怎么去定位执行效率低的SQL语句。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 165,065
精华内容 66,026
关键字:

mysql查看sql执行效率

mysql 订阅