• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > 查询mysql中执行效率低的sql语句的方法

查询mysql中执行效率低的sql语句的方法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了mysql 执行效率,mysql实时写入效率,mysql in select 效率,mysql提高查询效率,mysql in 查询效率等相关知识,希望本文的分享对您有所帮助

一些小技巧
1. 如何查出效率低的语句?
在MySQL下,在启动参数中设置 --log-slow-queries=[文件名],就可以在指定的日志文件中记录执行时间超过long_query_time(缺省为10秒)的SQL语句。你也可以在启动配置文件中修改long query的时间,如:

</div>

2. 如何查询某表的索引?
可使用SHOW INDEX语句,如:

</div>

3. 如何查询某条语句的索引使用情况?
可用EXPLAIN语句来看一下某条SELECT语句的索引使用情况。如果是UPDATE或DELETE语句,需要先转换为SELECT语句。
4. 如何把导出INNODB引擎的内容到错误日志文件中?
我们可以使用SHOW INNODB STATUS命令来查看INNODB引擎的很多有用的信息,如当前进程、事务、外键错误、死锁问题和其它一些统计数据。如何让该信息能记录在日志文件中呢?只要使用如下语句创建innodb_monitor表,MySQL就会每15秒钟把该系统写入到错误日志文件中:

</div>

如果你不再需要导出到错误日志文件,只要删除该表即可:

</div>

5. 如何定期删除庞大的日志文件?
只要在启动配置文件中设置日志过期时间即可:

</div>

经验教训
1. 重点关注索引
下面以表TSK_TASK表为例说明SQL语句优化过程。TSK_TASK表用于保存系统监测任务,相关字段及索引如下:

    ID:主键;
    MON_TIME:监测时间;建了索引;
    STATUS_ID:任务状态;与SYS_HIER_INFO.ID建立了外键关系。


注MySQL自动会为外键建立索引,在本次优化过程中,发现这些自动建立的外键索引会对SQL语句的效率产生不必要的干扰,需要特别注意!

首先,我们在日志文件中查到下面语句的执行比较慢,超过10秒了:

</div>

哦,原来在88143条记录中要查出符合条件的295条记录,那当然慢了。赶紧用EXPLAIN语句看一下索引使用情况吧:

    +----+-------------+----------+------+----------------------------------------------------------+------------------------------------+---------+-------+--------+-------------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +----+-------------+----------+------+----------------------------------------------------------+------------------------------------+---------+-------+--------+-------------+
    | 1 | SIMPLE | TSK_TASK | ref | FK_task_status_id_TO_SYS_HIER_INFO,TSK_TASK_KEY_MON_TIME | FK_task_status_id_TO_SYS_HIER_INFO | 9 | const | 276168 | Using where |
    +----+-------------+----------+------+----------------------------------------------------------+------------------------------------+---------+-------+--------+-------------+


可以看出,有两个索引可用FK_task_status_id_TO_SYS_HIER_INFO,TSK_TASK_KEY_MON_TIME,而最终执行语句时采用了STATUS_ID上的外键索引。

再看一下TSK_TASK表的索引情况吧:

    +----------+------------------------------------+-------------+-------------+
    | Table | Key_name | Column_name | Cardinality |
    +----------+------------+------------------------------------+--------------+
    | TSK_TASK | PRIMARY | ID | 999149 |
    | TSK_TASK | FK_task_status_id_TO_SYS_HIER_INFO | STATUS_ID | 16 |
    | TSK_TASK | TSK_TASK_KEY_MON_TIME | MON_TIME | 13502 |
    +----------+------------------------------------+-------------+-----------+--


在Oracle或其他关系数据库下,WHERE条件中的字段顺序对索引的选择起着很重要的作用。我们调整一下字段顺序,把STATUS_ID放在后面,再EXPLAIN一下:

</div>

但是没什么效果,MySQL还是选用系统建立的STATUS_ID外键索引。

仔细分析一下,看来Cardinality属性(即索引中的唯一值的个数)对索引的选择起了极其重要的作用,MySQL选择了索引值唯一值个数小的那个索引作为整条语句的索引。

针对这条语句,如果使用FK_task_status_id_TO_SYS_HIER_INFO做索引,而TSK_TASK表中存放很多天数据的话,那扫描的记录数会很多,速度较慢。可以有以下几个优化方案:

    如果一天的任务数不多的话,我们删除索引FK_task_status_id_TO_SYS_HIER_INFO,那MySQL会使用索引TSK_TASK_KEY_MON_TIME,然后在该天的数据中在扫描STATUS_ID为1064的记录,那速度也不慢;
    如果一天的任务数多的话,我们需删除索引FK_task_status_id_TO_SYS_HIER_INFO和TSK_TASK_KEY_MON_TIME,然后再建立STATUS_ID,MON_TIME的联合索引,这样效率肯定会很高。


因此建议,对那些记录数多的表,建议不要使用外键,以避免造成性能效率的严重降低。
2. 尽量控制每张表的记录数
当一张表的记录数很大时,管理和维护就会很麻烦,如索引维护就会占用很长时间,从而会给系统的正常运行造成很大的干扰。

对随时间推移数据量不断增长的表,我们可以根据时间来区分实时数据和历史数据,可以使用后台服务程序定期移动实时表中的数据到历史表中,从而控制实时表的记录数,提高查询和操作效率。但注意每次移动的时间要足够短,不要影响正常程序的数据写入。如果占用时间太长,可能会造成死锁问题。
3. 数据散列(partition)策略
当客户数达到一定规模后,单个数据库将无法支撑更高的并发访问,此时可以考虑把客户数据散列(partition)到多个数据库中,以分担负载,提高系统的整体性能与效率。

数据散列可以考虑采用federeated或sharded方式,网上有不少这方面的资料。
一些小技巧
1. 如何查出效率低的语句?
在MySQL下,在启动参数中设置 --log-slow-queries=[文件名],就可以在指定的日志文件中记录执行时间超过long_query_time(缺省为10秒)的SQL语句。你也可以在启动配置文件中修改long query的时间,如:

</div>

2. 如何查询某表的索引?
可使用SHOW INDEX语句,如:
代码如下:</

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 查询mysql中执行效率低的sql语句的方法
  • mysql下mysql-udf-http效率测试小记
  • 提高MySQL中数据装载效率
  • MySQL优化之如何查找SQL效率低的原因
  • mysql分页原理和高效率的mysql分页查询语句

相关文章

  • 2018-12-05oracle区管理和段空间管理详细介绍
  • 2018-12-05 SQL Server 日志配置问题
  • 2018-12-05mysql 按照时间段来获取数据的方法
  • 2018-12-05SQL Server 数据页缓冲区的内存瓶颈分析
  • 2018-12-05mysql常用基础操作语法(八)~~多表查询合并结果和内连接查询【命令行模式】
  • 2018-12-05mysql 控制台操作
  • 2018-12-05什么叫MySQL元数据?元数据的介绍及实例代码
  • 2018-12-05如何解决Mysql启动报ERROR:2002的分析
  • 2018-12-05Oracle BULK COLLECT批量取数据解决方法
  • 2018-12-05非常详细的SQL--JOIN之完全用法

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • mysql优化配置参数
    • mysql输入查询及退出查询命令
    • Java数据类型与MySql数据类型对照表_MySQL
    • MySQL 数据库常用命令小结
    • MySQL数据库管理常用命令小结
    • mysql delete limit 使用方法详解
    • sqlserver中重复数据值只取一条的sql语句
    • 详细介绍MySQL5.7 zip版本安装配置图文教程
    • MySQL数学函数简明总结
    • oracle数据库添加或删除一列的sql语句

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有