性能测试问题-Mysql数据库服务器的CPU占用很高

MySQl服务器CPU占用很高

1.  问题描述

一个简单的接口,根据传入的号段查询号码归属地,运行性能测试脚本,20个并发mysql的CPU就很高,监控发现只有一个select语句,且表建立了索引

2.  问题原因

查询语句索引没有命中导致

开始时的select

SELECT

`province_name`,

`city_name`

FROM `phoneno_section`

WHERE SUBSTRING(?, phoneno_section_len) = phoneno_section

LIMIT ?

咨询说where中使用SUBSTRING函数不行,修改函数为LEFT,语句为

SELECT

`province_name`,

`city_name`

FROM `conf_phoneno_section`

WHERE LEFT(?, phoneno_section_len) = phoneno_section

LIMIT ?

测试发现CPU占用还是很高,LEFT函数中的参数是变量不是常量,再次修改select语句,指定LEFT函数中的phoneno_section_len为固定值,CPU占用正常

3.  MYSQL索引介绍

ü  先举个例子

表a, 字段:  id(自增id),user(用户名),pass(密码),type(类型 0,1),

索引: user + pass 建立联合索引 ,user唯一索引,pass普通索引 ,type 普通索引

ü  索引命中说明

(1)SELECT   *   FROM   a  WHERE user = ‘t‘  AND PASS = ‘p‘会命中user+pass的联合索引

(2)SQL:  SELECT   *   FROM   a  WHERE user = ‘t‘ OR user= ‘f‘  不能命中任何索引

(3)SQL:  SELECT   *   FROM   a  WHERE user = ‘t‘会命中user唯一索引

(4)SQL:  SELECT   *   FROM   a  WHERE pass = ‘p‘   不能命中任何索引

(5)SELECT  *  FROM  a WHERE user = ‘t‘  OR   user= ‘f‘ 相对于SELECT  user,pass  FROM  a  WHERE user = ‘t‘  OR   user= ‘f‘  会慢

(6)SELECT * FROM a WHERE length(user) = 3 不能命中

(7)user唯一索引 、type索引可以删除

索引就是排序,目前的计算机技术和数学理论还不支持一次同时按照两个关键字进行排序,即使是联合索引,也是先按照最左边的关键字先排,然后在左边的关键字排序基础上再对其他的关键字排序,是一个多次排序的结果。 所以,单表查询,一次最多只能命中一个索引,并且索引必须遵守最左前缀。于是基于索引的结构和最左前缀,像 OR ,like ‘%%‘都是不能命中索引的,而like ‘aa%‘则是可以命中的。

无论是innodb还是myisam,索引只记录被排序的行的主键或者地址,其他的字段还是需要二次查询,因此,如果查询的字段刚好只是包含在索引中,那么索引覆盖将是高效的。

如果所有的数据都一样,或者基本一样,那么就没有排序的必要了。像例子中的type只有1或者0,选择性是0.5,极低的样纸,所以可以忽视,即使建立了,也是浪费空间,mysql在查询的时候也会选择丢弃。

类似最左前缀,查询索引的时候,如果列被应用了函数,那么在查询的时候,是不会用到索引的。道理很简单,函数运算已经改变了列的内容,而原始的索引是对列内容全量排序的。

综上所述,索引的几个知识点:最左前缀,索引覆盖,索引选择性,列隔离在建立和使用索引的时候需要格外注意。

4.  MySQl索引无效场景补充

ü  WHERE子句的查询条件里有不等于号(WHERE column!=...),MYSQL将无法使用索引

ü  WHERE子句的查询条件里使用了函数(如:WHERE DAY(column)=...),MYSQL将无法使用索引,实验中LEFT函数是可以的,但是条件不能是变量,使用LEFT函数且条件是变量,也无法使用索引,LEFT函数之外是否有其它函数有待验证

ü  在JOIN操作中(需要从多个数据表提取数据时),MYSQL只有在主键和外键的数据类型相同时才能使用索引,否则即使建立了索引也不会使用

ü  如果WHERE子句的查询条件里使用了比较操作符LIKE和REGEXP,MYSQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是LIKE ‘abc%‘,MYSQL将使用索引;如果条件是LIKE ‘%abc‘,MYSQL将不使用索引。

ü  在ORDER BY操作中,MYSQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。尽管如此,在涉及多个数据表的查询里,即使有索引可用,那些索引在加快ORDER BY操作方面也没什么作用。

ü  如果某个数据列里包含着许多重复的值,就算为它建立了索引也不会有很好的效果。比如说,如果某个数据列里包含了净是些诸如“0/1”或“Y/N”等值,就没有必要为它创建一个索引。

只要建立了索引,除了上面提到的索引不会使用的情况下之外,其他情况只要是使用在WHERE条件里,ORDER BY 字段,联表字段,索引一般都是有效的。

5.  参考资料

http://www.jb51.net/article/37190.htm

http://terry831010.blog.163.com/blog/static/69161171201382011498834/

时间: 2024-11-10 13:24:33

性能测试问题-Mysql数据库服务器的CPU占用很高的相关文章

swoole cpu占用很高 porcess

情况:未开启swoole cup占用20%,开启swoole cup占用飙升到70 各种排查...哪怕是放以下那么点代码,cpu立马飙升70% $SystemNoticeProcess = new Swoole\Process(function($process) use ($server) { }); // 推送系统通知SystemNotice $this->server->addProcess($SystemNoticeProcess); 解决办法:增加sleep休眠 $SystemNot

JVM探秘:线上CPU占用过高故障排查

线上系统突然变得卡顿或无法访问,排除网络异常的情况下,检查服务器资源占用情况,如果CPU.内存.磁盘IO等资源占用过高,就会导致无法继续处理HTTP请求. 如果是CPU占用飙高,有可能是程序中存在死循环.死锁导致的,也有可能是内存紧张从而频繁GC导致的,要具体问题具体分析. 排查过程 这里记录一次线上CPU占用过高的故障排查过程,重点会用到jstack命令. top命令 首先,使用top命令查看服务器资源使用情况,找到CPU占用过高的进程. 发现pid为29167的Java进程CPU占用很高,已

工具运行过程中,CPU占用过高的分析定位

之前使用Java Swing开发了一款设备档案收集工具.支持多台设备同时收集,每个设备使用一个线程.在同时收集多台设备信息时,发现CPU占用率居然达到了97%,而且高居不下.显然这样的性能是令人无法忍受的. 我们知道,通过jdk自带的工具jvisualvm可以查看每个线程的执行情况,但就是无法分析每个线程的CPU占用情况.由于工具是运行在Windows系统上的,所以也没办法像Linux下面那样通过命令去分析线程的CPU占用.而微软的process explorer工具可以解决这一难题.通过这个强

sqlserver 索引优化 CPU占用过高 执行分析 服务器检查

原文:sqlserver 索引优化 CPU占用过高 执行分析 服务器检查 1. 管理公司一台服务器,上面放的东西挺多的.有一天有个哥们告诉我现在程序卡的厉害.我给他说,是时候读点优化的书了.别一天到晚没个正形,现在写的程序卡的跑不动.他说我本地 是好好的,跑的很快.我说别扯那么多没用的,服务器不比你的本子强得多.待洒家上去看看.不看不知道一看吓一跳,CPU占用在95上下.开个程序是不卡,可整点有些时间是卡的一匹.这就令人很难受了. 本来服务器上也没有什么,就一个网站和几个数据库.那一个个分析吧,

Cacti监控mysql数据库服务器实现过程

Cacti监控mysql数据库服务器实现过程 2014-05-29      0个评论    来源:Cacti监控mysql数据库服务器实现过程   收藏    我要投稿 1 先在cacti服务器端安装mysql模板 wget https://mysql-cacti-templates.googlecode.com/files/better-cacti-templates-1.1.8.tar.gz tar –xvf better-cacti-templates-1.1.8.tar.gz cd b

MySQL数据库服务器的架设

导读 MySQL数据库是Linux操作系统上用得最多的数据库系统,它可以非常方便的与其它服务器集成在一起,如Apache.Vsftpd.Postfix等.下面介绍RHEL 6平台MySQL数据库服务器的安装方法. 安装完整的MySQL数据库需要以下几个RPM包文件: perl-DBI-1.609-4.e16.i686.rpm:Perl语言的数据API perl-DBD-MySQL-4.013-3.e16.i686.rpm:MySQL与Perl语言的接口程序包 mysql-5.1.61-4.e16

Geronimo应用服务器和MySQL数据库服务器

就是Web 2.0的全部,尽管该术语出现才几乎一年的时间,但现在好像只有烹饪杂志还没有加入到讨论Web 2.0未来出路的行列中.自从出现了里程碑式的文章"What Is Web 2.0:Design Patterns and Business Models for the Next Generation of Software"(此文由Tim O'Reilly在2005年9月所写,参见参考资料中的链接),对Web 2.0这一由该文创造的术语的赞同或反对之声一直没有间断.尽管如此,大多数

MySQL数据库服务器整体规划(方法论)

我们在搭建MySQL数据库服务器的开始阶段就合理的规划,可以避免以后的很多问题的产生,大大节省我们的时间和精力,在一定幅度上降低成本.当然,这会涉及很多方面.比如机器的选型.业务评估和系统规划等. 所有的设计都是跟具体的需求相关的,我们首先要做的就是对业务进行整体评估.我在下面分享一个具体的例子. 一.业务需求 要求 指标 响应时间 查询和操作请求ms级别返回 数据总量 1年内大约有500GB的数据量 每秒请求量 每秒有3W次请求 读写比 读写比是1:1 重要程度 核心业务,P1级别故障 其他说

启用CentOS6.5 64位安装时自带的MySQL数据库服务器

本人在虚拟机上又安装了一台linux机器,作为MySQL数据库服务器用,在安装时选择了系统自带的MySQL服务器端,以下是启用步骤. 首先开启mysqld服务 #service mysqld start 进入/usr/bin目录#cd /usr/bin 设定mysql数据库root用户的密码#mysqladmin -u root password '123456' 进入mysql数据库管理控制台#./mysql -u root -pEnter password:Welcome to the My