精华内容
下载资源
问答
  • SQL查询优化

    万次阅读 多人点赞 2019-05-03 12:53:51
    SQL查询优化 一、获取有性能问题SQL的三种方法 通过用户反馈获取存在性能问题的SQL 通过慢查询日志获取存在性能问题的SQL 实时获取存在性能问题的SQL 二、慢查询日志介绍 1、使用慢查询日志获取有性能问题...

                                               SQL查询优化

    一、获取有性能问题SQL的三种方法

    1.     通过用户反馈获取存在性能问题的SQL
    2.     通过慢查询日志获取存在性能问题的SQL
    3.     实时获取存在性能问题的SQL

    二、慢查询日志介绍

        1、使用慢查询日志获取有性能问题的SQL

            (1) 参数配置

                slow_query_log 启动停止记录慢查询日志

                    . 启动:ON;

                    . 如果在已经运行的Mysql中启动慢查询日志功能,可以直接使用set global命令;

                    . 为了避免慢查询日志占用太多的存储空间,如果需要在指定的某一时间段内开启慢查询日志功能,可以通过脚本来定时的开关。

                slow_query_log_file 指定慢查询日志的存储路径及文件

                    . 默认情况下保存在MYSQL的数据目录中

                    . 日志存储和数据存储分开存储

                long_query_time 指定记录慢查询日志SQL执行时间的伐值        

                    . 默认值为10秒

                    . 通常改为0.001秒也就是1毫秒可能比较合适

                    . 记录范围:记录所有符合条件的SQL;包括查询语句;数据修改语句;已经回滚的SQL

                log_queries_not_using_indexes 是否记录未使用索引的SQL

            (2) 慢查询日志中记录的内容

                

                第一行:记录运行这条SQL的用户信息和用户线程ID号

                第二行:记录了执行这条SQL所使用的时间(精确到毫秒)

                第三行:记录了执行这条SQL所使用的锁的时间(精确到毫秒)

                第四行:记录了执行这条SQL返回的数据的行数

                第五行:记录了执行这条SQL扫描的数据的行数

                第六行:记录了执行这条SQL所用的时间(时间戳的形式)

                第七行:记录了我们所执行的SQL

            (3) 常用的慢查询日志分析工具(mysqldumpslow

                汇总除查询条件外其他完全相同的SQL,并将分析结果按照参数中所指定的顺序输出。

                mysqldumpslow -s r -t 10 slow-mysql.log

                -s order(c, t, l, r, at, al, ar)

                    指定按那种排序方式输出结果

                

                -t top

                    指定取前几条作为结束输出

            (4) 常用的慢查询日志分析工具(pt-query-digest

                安装过程自行百度

                pt-query-digest --explain h=127.0.0.1,u=root,p=p@ssWord iZwz948fbj8fd62q3tskypZ-slow.log

    三、慢查询日志实例

        

        

        

        

        

        

    四、实时获取性能问题

        可以通过mysql的information_schema数据库下的PROCESSLIST表实时的发现具有性能问题的SQL

        

        set global long_query_time=0;

        set global slow_query_log=on;

        select id, user, host, db, command, time, state, info from information_schema.processlist;

        select id, user, host, db, command, time, state, info from information_schema.processlist\G;    

        

        

    五、SQL的解析预处理及生成执行计划

        1、查询速度为什么会慢

            (1) MySQL服务器处理查询请求的整个过程

                . 客户端发送SQL请求给服务器

                . 服务器检查是否可以在查询缓存中命中该SQL

                . 服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划

                . 根据执行计划,调用存储引擎API来查询数据

                . 将结果返回给客户端

                在解析一个查询语句之前,如果查询缓存是打开的,那么MySQL会优先检查这个查询查询是否命中查询缓存中的数据。这个检查是通过一个对大小写敏感的哈希查找实现的。

                Hash查找只能进行全值匹配,所以请求的查询和缓存中的查询,即使只有一个字节的不同,那么也不会匹配到缓存中的结果。

                如果当前的查询恰好命中了查询缓存,那么在返回结果之前,MySQL就会检查用户权限,这任然是无需解析查询SQL语句的,因为查询缓存中已经存在了当前查询需要访问的一些表的信息,如果权限没有问题,MySQL会跳过所有的其他阶段,直接从缓存中拿到结果,并返回给客户端。这种情况下,查询是不会被解析的,也不会生成查询计划,不会被执行。

        2、查询缓存对SQL性能的影响

            从查询缓存中直接返回结果并不容易。

            每次在缓存中检查SQL是否命中时,都要对缓存加锁,所以对于一个读写频繁的系统使用查询缓存很可能会降低查询处理的效率。所以在这种情况下建议大家不要使用查询缓存。

            (1) 对查询缓存存在影响的一些系统参数

                query_cache_type 设置查询缓存是否可用

                    ON, OFF, DEMAND

                    DEMAND表示只有在查询语句中使用SQL_CACHE和SQL_NO_CACHE来控制是否需要缓存。

                query_cache_size 设置查询缓存的内存大小

                    单元字节必须是1024的整数倍。

                query_cache_limit 设置查询缓存可用存储的最大值

                    超过这个值就不会被缓存了,如果预先我们知道结果很大,不会被缓存,那么我们在查询上加上SQL_NO_CACHE可以提高效率。

                query_cache_wlock_invalidate 设置数据表被锁后是否返回缓存中的数据

                    默认关闭。

                query_cache_min_res_unit 设置查询缓存分配的内存块最小单位

            (2) MySQL依照这个执行计划和存储引擎进行交互

                这个阶段包括了多个子过程:

                    解析SQL,预处理,优化SQL执行计划。

                    . 语法解析阶段是通过关键字对MySQL语句进行解析,并生成一棵对应的“解析树”;

                        MySQL解析器将使用MySQL语法规则验证和解析查询

                            检查语法是否使用了正确的关键字

                            关键字的顺序是否正确

                    . 预处理阶段是根据MySQL规则进一步检查解析树是否合法;

                        检查查询中所涉及的表和数据列是否存在及名字或别名是否存在歧义等等

                    语法检查全都通过了,查询优化器就可以生成查询计划了。

            (3) 会造成MySQL生成错误的执行计划的原因

                . 统计信息不准确

                    存储引擎提供的信息。

                . 执行计划中的成本估算不等同于实际的执行计划的成本

                    MySQL服务器层并不知道哪些页面在内存中;哪些页面在磁盘上;哪些需要顺序读取;哪些页面要随机读取

                . MySQL优化器所认为的最优可能与你所认为的最优不一样

                . MySQL从不考虑其他并发的查询,这可能会影响当前查询的速度

                . MySQL有时候也会基于一些固定的规则来生成执行计划

                . MySQL不会考虑不受其控制的成本

                    存储过程、用户自定义的函数

            (4) MySQL优化器可优化的SQL类型

                . 重新定义表的关联顺序

                . 将外连接转化成内连接

                    where条件和库表结构等都可以使外连接等价于内连接。

                . 使用等价变换规则

                    (5=5 and a > 5)将被改写为a > 5

                . 优化count()、min()和max()

                    select tables optimized away

                    优化器已经从执行计划中移除了该表,并以一个常熟取而代之

                . 将一个表达式转化为常数表达式

                . 子查询优化

                    子查询转换为关联查询,可以减少查询的次数

                . 提前终止查询

                    表中dilm_id字段为无符号整型,当其值为-1时,就会终止查询。

                    

                . 对in()条件进行优化

                    MySQL将in列表中的数据先进行排序,然后通过二分查找的方式来确定列表中的值是否满足条件。

    六、如何确定查询处理各个阶段所消耗的时间

        1、使用profile

            set profiling = 1;

            启动profile

                这是一个session级的配置,只有在当前session下,才能起作用。启动profile后,在服务器上执行的所有语句都会记录其消耗的时间和其他一些查询执行的状态。

            执行查询

            show profiles;

                查看每一个查询所消耗的总时间的信息。

            show profile for query N;

                查询每个阶段所消耗的时间。

            实例:

                set profiling = 1;

                

                select count(*) from film;

                

                 show profiles;

                

                show profile for query 1;

                

                show profile cpu for query 1;

                

        2、使用performance_schema

            设置语句:

                UPDATE 'setup_instruments' SET enabled='YES', TIMED='YES' WHERE NAME LIKE 'stage%';

                UPDATE setup_consumers SET enabled='YES' WHERE NAME LIKE 'events%';

            执行语句:

    select a.thread_id, sql_text, c.event_name, (c.timer_end - c.timer_start)/1000000000 as 'duration(ms)' 
    from events_statements_history_long a 
    join threads b on a.thread_id=b.thread_id 
    join events_stages_history_long c on c.thread_id=b.thread_id and c.event_id between a.event_id and a.end_event_id 
    where b.processlist_id=connection_id() and a.event_name='statement/sql/select' 
    order by a.thread_id, c.event_id

            执行结果:

            

    七、特定SQL的查询优化

        1、大表的数据修改最好要分批处理

            1000万行记录的表中删除/更新100万行记录一次只删除/更新5000行记录

            为了减少主从复制同步带来的压力,我们可以在每次修改数据后暂停几秒,给主从复制集群提供一个同步数据的时间。

        2、大表的删除        

     delimiter$$
     use 'imooc'$$
     drop procedure if exists 'p_delete_rows'$$
     create definer='root'@'127.0.0.1' procedure 'p_delete_rows'()
     begin
    	declare v_rows int;
    	set v_rows = 1; 
    	while v_rows > 0 
    	do 
    		delete from 'sbtest1' where id >= 9000 and id <= 19000 limit 5000;
    		select row_count() into v_rows;
    		select sleep(5); 
    	end while;
    end$$
    delimiter;  

        3、如何修改大表的表结构

            对表中的列的字段类型进行修改

            改变字段的宽度时还是会锁表

            无法解决主从数据库延迟的问题

            (1) 方案一:

                利用主从复制服务器架构,先在从服务器上进行修改,

                

                然后进行主从切换,

                

                最后在老的主服务器上进行修改。

                

            (2) 方案二:

                在主服务器上建立一个新的表,这个新表的结构就是要修改之后的这个表的结构;

                然后再把老表的数据导入到新表中;

                并且在老表上建立一系列的触发器,把老表数据的修改也同步更新到新表中;

                当老表和新表数据同步后,对老表加一个排它锁,重新命名新表和老表的名字;

                最后删除重命名后的老表。

                

                由于实现过程复杂,我们可以借助工具:

                    alter:对语句进行的修改

                    user:执行这个修改的执行用户的用户名,用户对需要修改表结构的表要有修改其表结构的权限

                    password:执行这个修改的执行用户的密码

                    D:要修改的表所在的数据库名

                    t:要修改的表的表名

                    charset:指定表的字符集          

                    execute:指定是否执行这个修改

                    pt-online-schema-change --alter="MODIFY c VARCHAR(150) NOT NULL DEFAULT ''" --user=root --password=PassWord D=imooc,t=sbtest4 --charset=utf8 --execute

                    

                    

                    

        4、如何优化not in和<>查询

            SELECT customer_id, first_name, last_name, email

            FROM customer

            WHERE customer_id

            NOT IN (SELECT customer_id FROM payment)

     

            SELECT customer_id, first_name, last_name, email

            FROM customer a

            LEFT JOIN payment b ON a.customer_id=b.customer_id

            WHERE b.customer_id IS NULL

        5、使用汇总表优化查询

            SELECT COUNT(*) FROM product_comment WHERE product_id = 999

            汇总表就是提前以要统计的数据进行汇总并记录到表中以备后续的查询使用。

            如上SQL查询可进行如下优化:

                新创建一个表,统计出截止前一天每一个商品评论数数据的汇总

                CREATE TABLE product_comment_cnt(product_id INT, cnt INT);

                显示每个商品的评论数:

                    SELECT SUM(cnt) FROM (

                     SELECT cnt FROM product_comment_cnt WHERE product_id=999

                     UNION ALL

                     SELECT COUNT(*) FROM product_comment WHERE product_id=999 AND timestr>DATE(NOW())

                    ) a

    友情提示:

        博主每天写博客也很辛苦,如果您觉得这篇博客对您有帮助,就赏博主一块两块的,给博主买个包子吃,以便能写出更好的博客,谢谢。

        如果内容中有不对的地方,或是有更好的方案,也欢迎大家提出来,共同学习!

    展开全文
  • sql查询优化

    万次阅读 2017-06-18 14:23:18
    浅析sql查询优化开门见山,结合笔者工作中处理过的问题,以及前人的经验,总结几点有关sql查询优化时的注意问题。不完善之处还望多多指正。一、 避免全表扫描 全表扫描往往是由索引失效造成,那么什么情况下会造成...

    浅析sql查询优化

    开门见山,结合笔者工作中处理过的问题,以及前人的经验,总结几点有关sql查询优化时的注意问题。不完善之处还望多多指正。

    一、 避免全表扫描
    全表扫描往往是由索引失效造成,那么什么情况下会造成索引失效?
    where字句中对字段进行运算或函数操作,where多子句的先后顺序(mysql自左向右来执行where字句)。n!=,<>, in, not in, or ,like 的使用,null 值判断。
    当处理这些问题的时候,能避免以上用法,尽量避免。当然不是说要舍近求远,具体问题具体分析,视查询效率而定。

    二、用什么取什么
    多余的数据一个也不取,避免使用select * ,合理运用limit。

    三、合理利用存储空间
    能使用数字类型就不用字符类型,(引擎在处理查询和连接时会逐个比较字符串中每一个字符,而数字型只需比较一次);char和varchar,通常情况用varchar(char存储效率不如varchar,对于短数据的查询优于varchar。存储很短的信息、存储固定长度、频繁改变的column时,这三种情况宜用char)

    四、重复运用的数据采用临时表
    临时表慎用,适当使用可以使某些例程更有效,如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于单次事件,最好使用导出表

    五、日志产生
    查询时产生的日志也会降低效率。创建临时表时,若一次性插入大量数据,那么可以通过 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

    以上主要从sql方面考虑,提高查询效率还可以通过 将数据、日志、索引放到不同的I/O设备上,增加读取速度。数据量(尺寸)越大,提高I/O越重要。对数据表进行分割,减少表的尺寸。升级硬件,提高网速等。

    展开全文
  • SQL查询优化工具--EverSQL

    千次阅读 2020-01-05 01:27:43
    EverSQ是L一款免费的、开源的、在线SQL查询优化工具。EverSQL提供了监控SQL查询性能的最简单方法,具有以下功能: 轻松优化SQL查询 简单易用 配有直观的界面 无需下载或安装。 只需上传或输入查询,上传架构并获得...

    EverSQ是L一款免费的、开源的、在线SQL查询优化工具。EverSQL提供了监控SQL查询性能的最简单方法,具有以下功能:

    • 轻松优化SQL查询
    • 简单易用
    • 配有直观的界面
    • 无需下载或安装。
    • 只需上传或输入查询,上传架构并获得优化的查询结果
    • 不需要任何数据库访问权限。
    • 支持MySQL,MariaDB和PerconaDB数据库。
    • 提供最佳索引建议。

    官网
    效果图:
    在这里插入图片描述

    展开全文
  • 开源的SQL查询优化工具--EverSQL

    千次阅读 2020-04-19 08:11:34
    开源的SQL查询优化工具–EverSQL 概述 一般来说,SQL查询优化器分析给定查询的许多选项,预估每个选项的成本,最后选择成本最低的选项。如果查询优化器选择了错误的计划,则性能差异可能从几毫秒到几分钟。幸运的是...

    开源的SQL查询优化工具–EverSQL

    概述

    一般来说,SQL查询优化器分析给定查询的许多选项,预估每个选项的成本,最后选择成本最低的选项。如果查询优化器选择了错误的计划,则性能差异可能从几毫秒到几分钟。幸运的是,现在有许多第三方SQL查询优化工具可以自动优化每个SQL查询。这些工具极大地简化了开发人员和数据库管理员的工作,因为他们提供了正确的查询调优建议和索引建议。现在我们已经知道了SQL查询优化器的重要性,下面推荐一款免费的优化工具–EverSQL。


    EverSQL

    EverSQL是一个在线SQL查询优化器,它提供了监控SQL查询性能的最简单方法。EverSQL具有以下功能:
    • 轻松优化SQL查询
    • 简单易用
    • 配有直观的界面
    • 无需下载或安装。
    • 只需上传或输入查询,上传架构并获得优化的查询结果
    • 不需要任何数据库访问权限。
    • 支持MySQL,MariaDB和PerconaDB数据库。
    • 提供最佳索引建议。


    使用入口

    https://www.eversql.com/sql-syntax-check-validator/


    通过这款SQL查询优化工具可以帮助你选择最少的时间和资源来执行正确查询,同时提供最佳性能。

    展开全文
  • MYSQL性能优化SQL查询优化

    千次阅读 2017-06-21 13:50:54
    SQL查询优化目的:减少查询所消耗的时间,加快查询的相应速度 获取有性能问题的SQL查询日志开销比较低 磁盘IO (顺序存储) 开销忽略不计 存储日志大小所需要的磁盘空间 (依赖) 控制sql配置 - slow_query_log...
  • MaxCompute SQL查询优化解析

    千人学习 2016-12-22 14:37:53
    MaxCompute是阿里云的大数据解决方案,它在跨数据中心的超大规模分布式系统上提供多种编程...这个分享会专注于SQL领域,介绍MaxCompute SQL近的发展,如何利用基于代价的优化器以及代码生成技术大幅提高了SQL查询效率。
  • DBA的五款优秀SQL查询优化工具

    千次阅读 2019-07-30 11:00:33
    一般来说,SQL查询优化器分析给定查询的许多选项,预估每个选项的成本,最后选择成本最低的选项。如果查询优化器选择了错误的计划,则性能差异可能从几毫秒到几分钟。幸运的是,现在有许多第...
  • SQL查询优化——数据结构设计

    万次阅读 2014-10-06 16:51:31
    数据库设计及使用是WEB开发程序员必备的一项基础技能,在大数据量和高并发场景,合理的数据结构及SQL查询优化对项目来说都会显得格外重要。大部分有经验的程序员都能了解到,程序的瓶颈往往不在程序本身,而在数据...
  • 大数据SQL查询优化

    千次阅读 2020-02-05 22:09:39
    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id ...
  • sql server ,sql如下: select *from ( select subject,COUNT(Subject) as cout from Questions where UserID ...上面的SQL的确能得到我想要的结果,但是,总感觉不好啊,本人sql小白,求大家给优化下,谢谢...
  • 高mysql千万级大数据SQL查询优化几条经验
  • sql查询优化or篇

    千次阅读 2020-03-03 17:33:00
    sql,使用or的情况 SELECT * FROM coin_trade_history WHERE (buyer_uid = ${userId} OR seller_uid = ${...在有索引的情况可以使用UNION ALL函数,优化后的sql SELECT * FROM coin_trade_history WHERE buyer...
  • 一、SQL查询优化(重要) 1.1 获取有性能问题SQL的三种方式 通过用户反馈获取存在性能问题的SQL; 通过慢查日志获取存在性能问题的SQL; 实时获取存在性能问题的SQL; 1.1.2 慢查日志分析工具 相关配置参数: ...
  • Sql server 千万级大数据SQL查询优化

    万次阅读 2018-08-04 16:08:44
    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id ...
  • ——Oracle SQL查询优化 (1) 数据读取方式 1、 Oracle数据读取操作: 1.1数据读取操作类型:  在任何的数据库中,当我们发起一个SQL语句进行数据查询时,SQL执行引擎为了能够返回我们需要的数据,都会进行...
  • Oracle SQL查询优化方法1

    千次阅读 2017-04-18 14:51:45
    系统优化中很重要的方面是SQL语句的优化,对于海量数据,优质的SQL能够有效的提高系统的可用性。 总结的有点罗嗦,列个简单的目录啦~ 目录 ...第一部分 知识准备 第二部分 ... 第三部分 sql优化总结  1. sql
  • mysql千万级大数据SQL查询优化

    万次阅读 多人点赞 2016-07-29 13:27:31
    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select ...
  • Sql Server 执行计划及Sql查询优化

    千次阅读 2010-07-18 15:45:00
    今天来讨论下MSSQL的执行计划,来让大家知道如何查看MSSQL的优化机制,以此来优化SQL查询,而不是仅仅用程序执行结果来优化
  • 1.查询的模糊匹配 尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用. 解决办法: 其实只需要对该脚本略做改进,查询速度便会提高近百倍。...
  • Mysql避免全表扫描sql查询优化

    千次阅读 2017-12-26 14:07:07
    查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引: .尝试下面的技巧以避免优化器错选了表扫描: ·使用ANALYZE TABLE tbl_name为扫描的表更新关键字分布。 ·对扫描的表...
  • 本文主要内容:1:查询语句where 子句使用时候优化或者需要注意的2:like语句使用时候需要注意3:in语句代替语句4:索引使用或是创建需要注意假设用户表有一百万用户量。也就是1000000.num是主键1:对查询进行优化,...
  • SQL查询优化 LEFT JOIN和INNER JOIN

    万次阅读 2014-12-16 17:28:22
    Sybase SQL Server索引的使用和优化: 本文就SQL Server索引的性能问题进行了一些分析和实践。  一、聚簇索引(clustered indexes)的使用  聚簇索引是一种对磁盘上实际数据重新组织以按指定的一个或多个...
  • 在项目中写了一个查询语句,一个表的字段不包含在另一张表中有哪些。 语句如下: select distinct a.parentcorrelation, a.sendtime from complaint_ftp_compare as a where a.sendtime >= '2011-01-01 00:00:00' ...
  • 1:查询语句where 子句使用时候优化或者需要注意的 2:like语句使用时候需要注意 3:in语句代替语句 4:索引使用或是创建需要注意 假设用户表有一百万用户量。也就是1000000.num是主键 1:对查询进行优化,应...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 503,202
精华内容 201,280
关键字:

sql查询优化