首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | HR | 镜像
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
搜索中心 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>linux数据库>其他>正文

Linux下MySQL性能的检查和调优方法

http://www.oklinux.cn  2009-03-30  xpb.cn    会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn

我一直是使用MySQL这个数据库软件,它工作比较稳定,效率也很高。在遇到严重性能问题时,一般都有这么几种可能:

1、索引没有建好;

2、sql写法过于复杂;

3、配置错误;

4、机器实在负荷不了;

1、索引没有建好

如果看到MySQL消耗的cpu很大,可以用MySQL的client工具来检查。

在Linux下执行

/usr/local/mysql/bin/mysql -hlocalhost -uroot -p

输入密码,如果没有密码,则不用-p参数就可以进到客户端界面中。

看看当前的运行情况

show full processlist

可以多运行几次

这个命令可以看到当前正在执行的sql语句,它会告知执行的sql、数据库名、执行的状态、来自的客户端ip、所使用的帐号、运行时间等信息

在我的cache后端,这里面大部分时间是看不到显示任何sql语句的,我认为这样才算比较正常。如果看到有很多sql语句,那么这台mysql就一定会有性能问题

如果出现了性能问题,则可以进行分析:

1、是不是有sql语句卡住了?

这是出现比较多的情况,如果数据库是采用myisam,那么有可能有一个写入的线程会把数据表给锁定了,如果这条语句不结束,则其它语句也无法运行。

查看processlist里的time这一项,看看有没有执行时间很长的语句,要留意这些语句。

2、大量相同的sql语句正在执行

如果出现这种情况,则有可能是该sql语句执行的效率低下,同样要留意这些语句。

然后把你所怀疑的语句统统集合一下,用desc(explain)来检查这些语句。

首先看看一个正常的desc输出:

mysql> desc select * from imgs where imgid=1651768337;

---- ------------- ------- ------- --------------- --------- --------- ------- ------ -------

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

---- ------------- ------- ------- --------------- --------- --------- ------- ------ -------

|1 | SIMPLE| imgs| const | PRIMARY | PRIMARY | 8 | const |1 | |

---- ------------- ------- ------- --------------- --------- --------- ------- ------ -------

1 row in set (0.00 sec)

注意key、rows和Extra这三项,这条语句返回的结果说明了该sql会使用PRIMARY主键索引来查询,结果集数量为1条,Extra没有显示,证明没有用到排序或其他操作。由此结果可以推断,mysql会从索引中查询imgid=1651768337这条记录,然后再到真实表中取出所有字段,是很简单的操作。

key是指明当前sql会使用的索引,mysql执行一条简单语句时只能使用到一条索引,注意这个限制;rows是返回的结果集大小,结果集就是使用该索引进行一次搜索的所有匹配结果;Extra一般会显示查询和排序的方式,。

如果没有使用到key,或者rows很大而用到了filesort排序,一般都会影响到效率,例如:

mysql> desc select * from imgs where userid="7mini" order by clicks desc limit 10;

---- ------------- ------- ------ --------------- ------ --------- ------ ------- -----------------------------

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

---- ------------- ------- ------ --------------- ------ --------- ------ ------- -----------------------------

|1 | SIMPLE| imgs| ALL| NULL| NULL | NULL| NULL | 12506 | Using where; Using filesort |

---- ------------- ------- ------ --------------- ------ --------- ------ ------- -----------------------------

1 row in set (0.00 sec)

这条sql结果集会有12506条,用到了filesort,所以执行起来会非常消耗效率的。这时mysql执行时会把整个表扫描一遍,一条一条去找到匹配userid="7mini"的记录,然后还要对这些记录的clicks进行一次排序,效率可想而知。真实执行时如果发现还比较快的话,那是因为服务器内存还足够将12506条比较短小的记录全部读入内存,所以还比较快,但是并发多起来或者表大起来的话,效率问题就严重了。

这时我把userid加入索引:

create index userid on imgs (userid);

然后再检查:

mysql> desc select * from imgs where userid="7mini" order by clicks desc limit 10;

---- ------------- ------- ------ --------------- -------- --------- ------- ------ -----------------------------

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

---- ------------- ------- ------ --------------- -------- --------- ------- ------ -----------------------------

|1 | SIMPLE| imgs| ref| userid| userid | 51| const |8 | Using where; Using filesort |

---- ------------- ------- ------ --------------- -------- --------- ------- ------ -----------------------------

1 row in set (0.00 sec)

嗯,这时可以看到mysql使用了userid这个索引搜索了,用userid索引一次搜索后,结果集有8条。然后虽然使用了filesort一条一条排序,但是因为结果集只有区区8条,效率问题得以缓解。

但是,如果我用别的userid查询,结果又会有所不同:

mysql> desc select * from imgs where userid="admin" order by clicks desc limit 10;

---- ------------- ------- ------ --------------- -------- --------- ------- ------ -----------------------------

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

---- ------------- ------- ------ --------------- -------- --------- ------- ------ -----------------------------

|1 | SIMPLE| imgs| ref| userid| userid | 51| const | 2944 | Using where; Using filesort |

共3页: 上一页 1 [2] [3] 下一页

上一篇:Linux下打开MySQL慢查询记录的配置方法   下一篇:解决OracleDBConsoleorcl不能启动,报错误码

收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·解决OracleDBConsoleorcl不能启动,报错误码
·Linux下打开MySQL慢查询记录的配置方法
·选择合适的Oracle数据库关闭方法
·Linux菜鸟的两天Oracle安装生活
·解决MySQL5数据库连接超时问题
·Linux中MySQL群集配置
·记录:Linux下安装MySQL 5
·Oracle For RedHat Linux 5(企业版)
·Linux下C语言处理MySQL数据库示例程序
·MySQL由于server-id相同造成的同步失败恢复
·MySQL数据库之更新语句精解
·RHEL4下安装32位Oracle 10G
·Oracle ebs 11.5.10 for Linux 安装心得
·手工创建Oracle数据库控制文件的策略
·Ubuntu 8.10下安装Oracle10g客户端
·从远程Linux服务的MySQL数据库dump数据
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·解决OracleDBConsoleorcl不能启动,报错
·Linux下打开MySQL慢查询记录的配置方法
·选择合适的Oracle数据库关闭方法
·Linux菜鸟的两天Oracle安装生活
·解决MySQL5数据库连接超时问题
·Linux中MySQL群集配置
·记录:Linux下安装MySQL 5
·Oracle For RedHat Linux 5(企业版)
·Linux下C语言处理MySQL数据库示例程序
·MySQL由于server-id相同造成的同步失败
·MySQL数据库之更新语句精解
·RHEL4下安装32位Oracle 10G
  阅读排行
·Linux下安装Oracle数据库完整笔记
·Oracle建表过程初学
·MySQL导入导出.sql文件步骤
·Linux平台下启动oracle 11g EM控制台
·Oracle 建立临时表语法及使用技巧
·RHEL5.1 下安装Oracle 10.2.0.1及常见
·Linux平台下配置MySQL主从复制
·Mysql JDBC驱动版本与Mysql版本的对应
·Linux操作系统下MySQL的卸载、安装全过
·Linux系统中Oracle数据库的用户权限
·关于MySQL事务处理学习
·Linux系统下启动MySQL的命令及相关知识
·Linux平台下修正MySQL中文乱码问题
·MySQL服务器上添加一个允许远程访问的
·手工配置Oracle 10G Enterprise Manage
网摘收藏: