- 浏览: 92984 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xiaoyi829:
应该可以grzrt 写道分区表partition,能用hand ...
初识mysql插件之HandlerSocket -
grzrt:
分区表partition,能用handlersocket查询指 ...
初识mysql插件之HandlerSocket
本文中介绍的系统优化,主要针对前端和后台这两方面(后台方面主要对SQL语句和数据存储进行了优化),下文中我们将介绍一些优化技巧和经验。
技巧:
1. 如何查出效率低的语句?
在MySQL下,在启动参数中设置 --log-slow-queries=[文件名],就可以在指定的日志文件中记录执行时间超过long_query_time(缺省为10秒)的SQL语句。你也可以在启动配置文件中修改long query的时间,如:
# Set long query time to 8 seconds
long_query_time=8
2. 如何查询某表的索引?
可使用SHOW INDEX语句,如:
SHOW INDEX FROM [表名]
3. 如何查询某条语句的索引使用情况?
可用EXPLAIN语句来看一下某条SELECT语句的索引使用情况。如果是UPDATE或DELETE语句,需要先转换为SELECT语句。
4. 如何把导出INNODB引擎的内容到错误日志文件中?
我们可以使用SHOW INNODB STATUS命令来查看INNODB引擎的很多有用的信息,如当前进程、事务、外键错误、死锁问题和其它一些统计数据。如何让该信息能记录在日志文件中 呢?只要使用如下语句创建innodb_monitor表,MySQL就会每15秒钟把该系统写入到错误日志文件中:
CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB;
如果你不再需要导出到错误日志文件,只要删除该表即可:
DROP TABLE innodb_monitor;
5. 如何定期删除庞大的日志文件?
只要在启动配置文件中设置日志过期时间即可:
expire_logs_days=10
注意事项:
1. 重点关注索引
下面以表TSK_TASK表为例说明SQL语句优化过程。TSK_TASK表用于保存系统监测任务,相关字段及索引如下:
ID:主键;
MON_TIME:监测时间;建了索引;
STATUS_ID:任务状态;与SYS_HIER_INFO.ID建立了外键关系。
注MySQL自动会为外键建立索引,在本次优化过程中,发现这些自动建立的外键索引会对SQL语句的效率产生不必要的干扰,需要特别注意!
首先,我们在日志文件中查到下面语句的执行比较慢,超过10秒了:
# Query_time: 18 Lock_time: 0 Rows_sent: 295 Rows_examined: 88143
select * from TSK_TASK WHERE STATUS_ID = 1064 and MON_TIME >= '2007-11-22' and MON_TIME < '2007-11-23';
原来在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一下:
EXPLAIN select * from TSK_TASK WHERE MON_TIME >= '2007-11-22' and MON_TIME < '2007-11-23' and STATUS_ID = 1064;
但是没什么效果,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)到多个数据库中,以分担负载,提高系统的整体性能与效率。
技巧:
1. 如何查出效率低的语句?
在MySQL下,在启动参数中设置 --log-slow-queries=[文件名],就可以在指定的日志文件中记录执行时间超过long_query_time(缺省为10秒)的SQL语句。你也可以在启动配置文件中修改long query的时间,如:
# Set long query time to 8 seconds
long_query_time=8
2. 如何查询某表的索引?
可使用SHOW INDEX语句,如:
SHOW INDEX FROM [表名]
3. 如何查询某条语句的索引使用情况?
可用EXPLAIN语句来看一下某条SELECT语句的索引使用情况。如果是UPDATE或DELETE语句,需要先转换为SELECT语句。
4. 如何把导出INNODB引擎的内容到错误日志文件中?
我们可以使用SHOW INNODB STATUS命令来查看INNODB引擎的很多有用的信息,如当前进程、事务、外键错误、死锁问题和其它一些统计数据。如何让该信息能记录在日志文件中 呢?只要使用如下语句创建innodb_monitor表,MySQL就会每15秒钟把该系统写入到错误日志文件中:
CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB;
如果你不再需要导出到错误日志文件,只要删除该表即可:
DROP TABLE innodb_monitor;
5. 如何定期删除庞大的日志文件?
只要在启动配置文件中设置日志过期时间即可:
expire_logs_days=10
注意事项:
1. 重点关注索引
下面以表TSK_TASK表为例说明SQL语句优化过程。TSK_TASK表用于保存系统监测任务,相关字段及索引如下:
ID:主键;
MON_TIME:监测时间;建了索引;
STATUS_ID:任务状态;与SYS_HIER_INFO.ID建立了外键关系。
注MySQL自动会为外键建立索引,在本次优化过程中,发现这些自动建立的外键索引会对SQL语句的效率产生不必要的干扰,需要特别注意!
首先,我们在日志文件中查到下面语句的执行比较慢,超过10秒了:
# Query_time: 18 Lock_time: 0 Rows_sent: 295 Rows_examined: 88143
select * from TSK_TASK WHERE STATUS_ID = 1064 and MON_TIME >= '2007-11-22' and MON_TIME < '2007-11-23';
原来在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一下:
EXPLAIN select * from TSK_TASK WHERE MON_TIME >= '2007-11-22' and MON_TIME < '2007-11-23' and STATUS_ID = 1064;
但是没什么效果,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)到多个数据库中,以分担负载,提高系统的整体性能与效率。
发表评论
-
mysql dump 备份及脚本!
2011-06-10 13:38 1552导出多张表的时候表之间用空格分开: # mysqldump ... -
mysql备份脚本
2011-06-03 17:32 683!/bin/sh # mysql_backup.sh: bac ... -
CentOS挂载移动硬盘
2011-06-03 15:12 10951, 首先确认fuse,CentOS 5.5 带有fuse,可 ... -
MySQL 左连接 右连接
2011-06-03 14:03 868表A记录如下: aID aNum 1 ... -
[转]CentOS5 下安装与配置飞鸽传书(Ipmsg)完美完结篇
2011-05-27 10:29 1560CentOS5 下安装与配置飞鸽传书(Ipmsg)完美完结篇 ... -
深入SQL语句性能调整
2011-05-17 13:20 861本文sqlserver为例 有 ... -
windows和linux下开启mysql日志
2011-05-11 10:24 2322mysql有以下几种日志: 错误日志: -log-err 查询 ... -
MYSQL数据库设计的一点总结
2011-04-13 14:48 702选表类型: 大家都知道 ... -
mysql 清理碎片
2011-04-13 09:59 915显示你数据库中存在碎片的全部列表: select tab ... -
MySQL 建表语法
2011-04-12 14:21 7991、最简单的: CREATE TABLE t1( id ... -
排序时最快的取出尽量少的字段且索引字段
2011-04-11 15:51 831select company_albums.id,compan ... -
MySQL性能优化
2011-04-02 10:53 731作者:andyao 原文link: http://andyao ... -
Mysql Innodb 引擎优化-参数
2011-03-30 16:49 769介绍: InnoDB给MySQL提供了具有提交,回滚和崩溃 ... -
MySQL配置文件my.cnf 做笔记用
2011-03-30 16:33 800MySQL配置文件my.cnf 例子最详细翻译,可以保存做笔记 ... -
测试脚本mysql_插入100万行数据
2011-03-29 16:31 1359CREATE DEFINER=`root`@`localhos ... -
Mysql日期和时间函数
2011-03-29 15:50 674这里是一个使用日期函 ... -
MySQL数据库优化的具体方法说明
2011-03-29 15:39 760以下的文章主要讲述的是实现MySQL数据库简单实用优化的具体方 ... -
MySQL之Explain
2011-03-29 15:16 622前记:很多东西看似简 ... -
MySQL维护命令集锦--查看表的状态(show table status)
2011-03-29 15:11 1229查看表的引擎类型等状态信息: show table statu ... -
mysql show status参数详解
2011-03-29 15:03 970Aborted_clients 由于客户没有正确 ...
相关推荐
3. 架构设计:一个基于PHP+MySQL的小型后台系统通常采用三层架构,包括表现层(前端)、业务逻辑层(后端)和数据访问层。表现层负责用户界面,后端处理业务逻辑,数据访问层则与数据库进行交互。 4. MVC模式:在...
《Python+MySQL开发的后台管理系统详解》 在现代软件开发中,Python因其简洁易读的语法和丰富的库支持,常被用于构建后端服务。同时,MySQL作为一款广泛应用的关系型数据库管理系统,以其高效稳定和良好的扩展性,...
《黑马电商后台管理系统:前端Vue与后端Node.js深度解析》 在当今互联网技术日新月异的时代,电商后台管理系统的构建已经成为企业运营的核心部分。本资料“黑马电商后台管理系统前端vue后端nodejs.zip”提供了全面...
综上所述,Java+MySQL学生学籍后台管理系统源码是一个综合运用多种技术和方法的教育信息化系统,它涵盖了软件开发的多个层面,包括后端处理、数据库设计、前端展示以及系统的整体架构。对于学习和理解企业级应用开发...
它提供了一个图形用户界面(GUI),使非程序员也能高效地进行数据操作和系统维护。 4. **版本号v1.0**: 这表示这是一个初始版本,可能包含基本功能但可能未经过多次迭代和优化。开发者可能在后续版本中添加更多功能...
【标题】: "计算机课程毕设个人毕设:前端后台管理系统" 这个项目是针对计算机科学与技术专业学生的毕业设计,其核心是一个集成了前端和后台的管理系统。在信息技术领域,前端和后台系统的协同工作是构建现代Web...
此外,为了保护用户隐私和系统安全,密码通常需要进行加密存储,并且后台访问应有限制和认证机制。 至于代码结构,一般会采用MVC(Model-View-Controller)设计模式,将业务逻辑、数据展示和用户交互分离,使代码更...
基于SSM+MySQL+Vue的后台资金管理系统能够提高资金管理的效率和accuracy,优化管理模式,方便化办公工作。该系统的设计和实现能够满足公司的资金管理需求,提高了公司的竞争力。 六、关键词 * 后台资金管理系统 * ...
QQ后台管理系统是一个专为QQ应用设计的后台管理平台,它主要负责处理与QQ相关的各种后台数据管理和运营工作。系统的设计和实现旨在提供高效、稳定且易于维护的解决方案,以满足QQ业务的日常运营需求。 首先,我们要...
本项目以"个人博客系统(前端展示+后端管理)"为核心,采用了一系列先进的技术栈,包括Vue、Springboot、Hibernate、Redis和Mysql,旨在打造一个功能完善的前后端分离式博客系统。 一、前端技术:Vue.js Vue.js 是一...
这个系统包括三个主要部分:前台展示、后台管理和后端服务。下面将详细介绍这三个部分以及涉及到的关键技术。 **前台展示** 前台是用户与网站交互的界面,它的设计和功能直接影响到用户体验。在企业门户网站中,...
5. **性能优化**:为了提升系统的响应速度和用户体验,可能需要进行数据库索引优化、缓存机制(如Memcached或Redis)的引入,以及页面静态化等技术手段。 6. **权限控制**:后台管理系统应具备用户权限控制,如普通...
该项目是一个基于SpringBoot、MySQL和Ajax技术的在线借阅系统,涵盖了前端用户界面以及后台管理功能。下面将详细解析这个项目中的主要知识点和技术栈。 **SpringBoot** SpringBoot是Spring框架的一个子项目,旨在...
在本系统中,【后台数据库为MySQL】,MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),以其高效、稳定和易用性而受到青睐。它支持SQL语言,用于存储、管理和检索数据,是构建大型网站和应用程序的理想选择...
本项目——“图书后台管理系统”就是一个典型的Java Web应用实例,它巧妙地结合了Servlet、LayUi前端框架和MySQL数据库,为图书管理提供了高效、便捷的解决方案。 Servlet,作为Java服务器端编程的核心技术,是Java...
MySQL是一种流行的开源关系型数据库管理系统,以其高效、稳定和易用性赢得了广泛的认可。在基于MySQL的客房数据库管理系统中,数据库是整个系统的数据存储中心,负责存储客房信息、预订记录、客户资料等关键数据。...
网站后台系统是构建互联网应用的核心组成部分,它负责处理前端用户无法直接看到的业务逻辑和数据管理。一个完整的网站后台系统通常包含多个关键组件,这些组件共同协作以提供高效、安全和用户友好的服务。让我们深入...
音乐后台管理系统是一个基于PHP编程语言和MySQL数据库技术构建的应用,主要用于管理和操控音乐相关的数据和功能。这个系统的设计目的是为了方便地存储、检索、更新和删除与音乐内容有关的信息,例如歌曲、艺术家、...