博客
关于我
MySQL(九)SQL优化
阅读量:640 次
发布时间:2019-03-14

本文共 2649 字,大约阅读时间需要 8 分钟。

一索引对DML语句效率的影响

在数据库环境中,CPU资源的90%被用来解析和执行SQL语句,因此提高SQL语句执行效率对高并发系统至关重要。而在众多的SQL语句中,SELECT查询语句应用最为广泛。要加快查询速度,使用索引是最有效的手段。当数据量较大时,MySQL提供了表分区等技术,其核心目标是降低数据库磁盘I/O开销,从而提升查询速度,减少磁盘读取量。


2实验准备

在实际应用中,当表数据量较大时,使用索引的优势将变得更加明显。以下是创建数据库及相关存储过程的步骤:

  • 创建测试数据库
  • create database test;use test;create table t(id int, name varchar(30));
    1. 创建存储过程proc1用于插入数据
    2. delimiter $$create procedure proc1(cnt int)begin  declare i int default 1;  start transaction;  repeat    insert into t(id, name) values(i, concat('a', i));    set i = i + 1;  until i > cnt  end repeat;  commit;end$$delimiter;
      1. 调用存储过程插入数据
      2. call proc1(1000000);
        1. 验证数据插入情况
        2. select count(*) from t;select * from t limit 5;

          3explain语句解析

          通过使用explain语句,可以深入了解MySQL服务器对SQL语句的执行过程。这是优化数据库性能的重要工具。

          explain select * from test.t;

          4百万记录取一条

          在实际应用中,单独查询特定记录的效率至关重要。以下是相关测试和优化过程:

        3. 查询单条记录
        4. -- 无索引,耗时长select * from t where id=1500;-- 几乎无效索引create index idx_id on t(id);-- 只需0.05秒select * from t where id=1500;
          1. 执行explain分析
          2. explain select * from t where id=1500;
            1. 索引优化效果
            2. -- 创建唯一索引create unique index idx_id on t(id);-- 索引已生效select * from t where id=1500;

              5百万记录取1000条

              在实际应用中,高效查询并不总是通过索引实现。以下是相关测试和优化过程:

            3. 无索引查询
            4. -- 无索引,耗时长select * from t where id between 1001 and 2000;
              1. 索引优化查询
              2. create index idx_id on t(id);select * from t where id between 1001 and 2000;
                1. 优化效果说明
                2. -- 建议:索引优化后的查询效率提升显著

                  6百万记录更新一条数据

                  在实际应用中,定位数据的准确性是优化 UPDATE 语句的关键。以下是相关测试和优化过程:

                3. 无索引更新
                4. update t set name='china' where id=1;
                  1. 索引优化更新
                  2. create index idx_id on t(id);update t set name='china' where id=1;
                    1. 优化效果说明
                    2. -- 索引优化后的更新效率更佳

                      7总结

                      从以上测试可以得出以下结论:

                    3. 索引的双刃剑效应:索引能够显著提升特定查询的执行效率,但也会增加数据表的存储空间和增删改操作的复杂度。
                    4. 索引应用原则:应重点创建那些经常查询条件字段的单列或多列索引,但需确保这些字段的查询条件记录数控制在总数据量的3%-5%以内。
                    5. 多列索引优化:在创建多列索引时,应将筛选数据最多的字段放在索引的最左侧,以便优化器优先利用这些高效筛选字段。

                    6. 8SQL语句优化技巧

                    7. 避免使用表达式作为查询条件
                    8. -- 不推荐select * from t where id-1 < 5;-- 简化方式select * from t where id < 5-1;
                      1. 或某些情况优于in
                      2. -- 适用于连续值查询select * from t where name between 'a1500' and 'a2000';
                        1. where子句优于having子句
                        2. -- where子句适合直接缩减查询结果集
                          1. 使用like时注意位置
                          2. -- 不推荐select * from t where name like 'a150_';-- 建议将通配符放在右侧

                            9表分区对查询效率的影响

                            通过表分区可以显著降低数据库的I/O负载,提升查询效率。以下是相关操作和测试过程:

                          3. 创建分区表
                          4. create table t1(id int, name varchar(30))partition by range(id)(  partition p1 values less than (200000),  partition p2 values less than (400000),  partition p3 values less than (600000),  partition p4 values less than (800000),  partition p5 values less than (1000000),  partition p6 values less than (maxvalue));
                            1. 数据迁移与查询测试
                            2. insert into t1 select * from t;
                              1. 查询效率对比
                              2. -- 无索引查询select * from t where id=1500;select * from t1 where id=1500;-- 查询未利用分区字段select * from t1 where name='a1500';

                                10总结

                                通过上述实验和分析,我们可以清晰地看到索引、SQL优化以及表分区等技术对数据库性能的重要提升作用。无论是查询效率还是更新定位准确性,这些技术都发挥了关键作用。不过,需要注意索引的使用成本和表分区的划分策略,以保持数据库的高效运行。

    转载地址:http://msylz.baihongyu.com/

    你可能感兴趣的文章
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
    查看>>
    NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
    查看>>
    NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>