的解决方法网赌十大信誉的平台,解决一个MySQL服务器进程CPU占用100

恋人主机(Windows 200三 + IIS + PHP + MYSQL )近来 MySQL 服务过程(mysqld-nt.exe) CPU 占用率总为 百分之百 只多相当的多。此主机有11个左右的
database, 分别给1一个网址调用。据朋友测试,导致 mysqld-nt.exe cpu
占用奇高的是网址A,一旦在 IIS 大校此网址甘休服务,CPU
占用就降下来了。一启用,则即刻进步。

MYSQL CPU 占用 百分之百 的面貌描述
  早晨帮朋友一台服务器消除了 Mysql cpu 占用 100%的难点。稍整理了一晃,将经历记录在那篇文章里

 MYSQL CPU 占用 百分之百 的化解进度
明天早晨精心检查了1晃。近期此网址的二十五日平均日 IP 为三千,PageView 为
两万左右。网址A 用的 database 近来有三二十个表,记录数 60.1万条,占空间
四五MB。按这几个数量,MySQL 不容许占用这么高的财富。

  朋友主机(Windows 200叁 + IIS + PHP + MYSQL )近些日子 MySQL 服务过程(mysqld-nt.exe) CPU 占用率总为 百分百 越来越多。此主机有拾叁个左右的
database, 分别给拾个网址调用。据朋友测试,导致 mysqld-nt.exe cpu
占用奇高的是网址A,1旦在 IIS 少校此网站截至服务,CPU
占用就降下来了。壹启用,则立即提升。

  于是在服务器上运转命令,将 mysql 当前的情状变量输出到文件
output.txt:

 MYSQL CPU 占用 百分百 的化解进度

d:\web\mysql> mysqld.exe --help >output.txt

  后天晚上精心检查了眨眼间间。近些日子此网址的10十三日平均日 IP 为三千,PageView
为 三万左右。网址A 用的 database 目前有三十多个表,记录数 60.1万条,占空间
45MB。按这一个数目,MySQL 不或然占用这么高的能源。

  发现 tmp_table_size 的值是暗中认可的 3二M,于是修改 My.ini, 将
tmp_table_size 赋值到 200M:

  于是在服务器上运转命令,将 mysql 当前的情形变量输出到文件
output.txt:

d:\web\mysql> notepad c:\windows\my.ini
[mysqld]
tmp_table_size=200M

d:webmysql> mysqld.exe –help >output.txt
  发现 tmp_table_size 的值是暗中认可的 32M,于是修改 My.ini, 将
tmp_table_size 赋值到 200M:

  然后重启 MySQL 服务。CPU 占用有细微下落,在此以前的CPU 占用波形图是 100%1根直线,今后则在 玖七%~百分百中间起伏。这注脚调整 tmp_table_size
参数
MYSQL 性能升高有革新功效。但难题还尚无完全化解。

d:webmysql> notepad c:windowsmy.ini
[mysqld]
tmp_table_size=200M

  于是进入 mysql 的 shell 命令行,调用 show processlist, 查看当前
mysql 使用频仍的 sql 语句:

  然后重启 MySQL 服务。CPU 占用有轻微降低,以前的CPU 占用波形图是 百分百壹根直线,以后则在 97%~百分之百里边起伏。那标识调解 tmp_table_size 参数对
MYSQL 品质进步有改革功效。但难点还一向不完全化解。

mysql> show processlist;

  于是进入 mysql 的 shell 命令行,调用 show processlist, 查看当前
mysql 使用频繁的 sql 语句:

  反复调用此命令,开掘网址 A 的多个 SQL 语句平常在 process list
中出现,其语法如下:

mysql> show processlist;
  反复调用此命令,开采网址 A 的三个 SQL 语句日常在 process list
中冒出,其语法如下:

SELECT t1.pid, t2.userid, t3.count, t1.date
FROM _mydata AS t1 
LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
LEFT JOIN _mydata_body AS t2 ON t1.pid=t3.pid
ORDER BY t1.pid
LIMIT 0,15

SELECT t1.pid, t2.userid, t3.count, t1.date
FROM _mydata AS t1
LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
LEFT JOIN _mydata_body AS t2 ON t1.pid=t3.pid
ORDER BY t1.pid
LIMIT 0,15
  调用 show columns 检查那四个表的结构 :

  调用 show columns 检查这四个表的布局 :

mysql> show columns from _myuser;
mysql> show columns from _mydata;
mysql> show columns from _mydata_body;
  终于意识了难点所在:_mydata 表,只依据 pid 建立了叁个 primary
key,但并不曾为 userid 建构目录。而在这一个 SQL 语句的第3个 LEFT JOIN ON
子句中:

mysql> show columns from _myuser;
mysql> show columns from _mydata;
mysql> show columns from _mydata_body;

LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
  _mydata 的 userid 被参预了准星相比运算。于是本身为给 _mydata
表依据字段 userid 创立了二个索引:

  终于意识了问题所在:_mydata 表,只依照 pid 塑造了一个 primary
key,但并未为 userid 创设目录。而在这几个 SQL 语句的率先个 LEFT JOIN
ON
子句中:

mysql> ALTER TABLE `_mydata` ADD INDEX ( `userid` )
  创设此索引之后,CPU 立刻降到了 八成左右。看到找到了难点所在,于是检查另五个反复出现在 show processlist 中的
sql 语句:

LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid

SELECT COUNT(*)
FROM _mydata AS t1, _mydata_key AS t2
WHERE t1.pid=t2.pid and t2.keywords = 孔雀
  经检查 _mydata_key 表的构造,开掘它只为 pid 建了了 primary key,
未有为 keywords 创设 index。_mydata_key 最近有 33万条记下,在平昔不索引的情事下对3三万条记下进行文本检索相配,不花费大批量的
cpu 时间才怪。看来就是对准那些表的追寻出标题了。于是同样为 _mydata_key
表依据字段 keywords 加上索引:

  _mydata 的 userid 被参加了规范比较运算。于是本人为给 _mydata
表根据字段 userid 建设构造了2个索引:

mysql> ALTER TABLE `_mydata_key` ADD INDEX ( `keywords` )
  创立此索引之后,CPU霎时降了下去,在 十二分之5~12分之7时期震荡。

mysql> ALTER TABLE `_mydata` ADD INDEX ( `userid` )

  再一次调用 show prosslist,网址A 的sql
调用就不多出现在结果列表中了。但意识此主机械运输转了多少个 Discuz 的论坛程序,
Discuz
论坛的少数个表也设有着这几个主题材料。于是顺手壹并化解,cpu占用再一次降下来了。(200七.0七.0九附注:关于 discuz
论坛的切实优化进程,笔者后来另写了1篇小说,详见:千万级记录的 Discuz!
论坛导致 MySQL CPU 百分之百 的 优化笔记
mysql-cpu-十0-optimize.htm”>)

  建设构造此索引之后,CPU 登时降到了 80%左右。看到找到了难点所在,于是检查另3个往往现身在 show processlist 中的
sql 语句:

 消除 MYSQL CPU 占用 百分之百 的经验总计

SELECT COUNT(*)
FROM _mydata AS t1, _mydata_key AS t2
WHERE t1.pid=t2.pid and t2.keywords = '孔雀'

增加 tmp_table_size 值。mysql 的布置文件中,tmp_table_size
的默许大小是 3二M。若是一张不常表超过该大小,MySQL发生一个 The table
tbl_name is full 形式的错误,假若你做过多高级 GROUP BY 查询,扩大tmp_table_size 值。 那是 mysql 官方关于此选项的演说:
tmp_table_size

  经检查 _mydata_key 表的组织,发掘它只为 pid 建了了 primary key,
未有为 keywords 建设构造 index。_mydata_key 方今有 33万条记下,在向来不索引的图景下对33万条记下实行理文件本检索相配,不花费多量的
cpu 时间才怪。看来正是本着这几个表的查找寻难题了。于是相同为 _mydata_key
表依照字段 keywords 加上索引:

This variable determines the maximum size for a temporary table in
memory. If the table becomes too large, a MYISAM table is created on
disk. Try to avoid temporary tables by optimizing the queries where
possible, but where this is not possible, try to ensure temporary tables
are always stored in memory. Watching the processlist for queries with
temporary tables that take too long to resolve can give you an early
warning that tmp_table_size needs to be upped. Be aware that memory is
also allocated per-thread. An example where upping this worked for more
was a server where I upped this from 32MB (the default) to 64MB with
immediate effect. The quicker resolution of queries resulted in less
threads being active at any one time, with all-round benefits for the
server, and available memory.

mysql> ALTER TABLE `_mydata_key` ADD INDEX ( `keywords` )

对 WHERE, JOIN, MAX(), MIN(), O福特ExplorerDERAV4 BY
等子句中的条件判定中用到的字段,应该依赖其建构索引
INDEX。索引被用来连忙寻觅在3个列上用一特定值的行。没有索引,MySQL不得不首先以率先条记下初始并然后读完全数表直到它搜索有关的行。表越大,花费时间越来越多。要是表对于查询的列有3个索引,MySQL能火速达到3个岗位去探索到数据文件的中间,无需考虑全数数据。如若贰个表有一千行,那比顺序读取至少快十0倍。全部的MySQL索引(PCRUISERIMA福特ExplorerY、UNIQUE和INDEX)在B树中贮存。

  创设此索引之后,CPU立时降了下去,在 八分之四~7/十之间震荡。

依据 mysql 的支付文书档案:

  再度调用 show prosslist,网址A 的sql
调用就没有多少出现在结果列表中了。但开掘此主机运转了多少个 Discuz 的论坛程序,
Discuz
论坛的有个别个表也存在着这一个难题。于是顺手一并缓慢解决,cpu占用再度降下来了。(2007.07.09
附注
:关于 discuz
论坛的切切实实优化进程,笔者后来另写了①篇小说,详见:千万级记录的 Discuz!
论坛导致 MySQL CPU 百分之百 的 优化笔记
)
化解 MYSQL CPU 占用 百分之百 的经验总括

索引 index 用于:

  1. 增加 tmp_table_size 值。mysql
    的安顿文件中,tmp_table_size 的暗中同意大小是
    32M。如若一张有时表高出该大小,MySQL发生二个 The table tbl_name
    is full
    形式的失实,就算你做过多高级 GROUP BY 查询,增加
    tmp_table_size 值
    。 那是 mysql 官方关于此选项的讲明:

    tmp_table_size

    This variable determines the maximum size for a temporary table in
    memory. If the table becomes too large, a MYISAM table is created
    on disk. Try to avoid temporary tables by optimizing the queries
    where possible, but where this is not possible, try to ensure
    temporary tables are always stored in memory. Watching the
    processlist for queries with temporary tables that take too long
    to resolve can give you an early warning that tmp_table_size
    needs to be upped. Be aware that memory is also allocated
    per-thread. An example where upping this worked for more was a
    server where I upped this from 32MB (the default) to 64MB with
    immediate effect. The quicker resolution of queries resulted in
    less threads being active at any one time, with all-round benefits
    for the server, and available memory.

  2. 对 WHERE, JOIN, MAX(), MIN(), OLX570DERubicon BY
    等子句中的条件推断中用到的字段,应该遵照其确立索引
    INDEX
    。索引被用来急速搜索在贰个列上用一特定值的行。未有索引,MySQL不得不首先以第2条记下初叶并然后读完全体表直到它搜索相关的行。表越大,开销时间更加的多。假设表对于查询的列有七个目录,MySQL能飞速达到2个职分去搜索到数据文件的中游,没有必要思考全体数据。如若1个表有一千行,那比顺序读取至少快拾0倍。全部的MySQL索引(PMuranoIMARAV4Y、UNIQUE和INDEX)在B树中蕴藏。

    依照 mysql 的支付文书档案:

    索引 index 用于

    • 快捷搜索同盟一个WHERE子句的行
    • 当实践统壹(JOIN)时,从别的表检索行。
    • 对特定的索引列找寻MAX()或MIN()值
    • 比如排序或分组在二个可用键的最右侧前缀上实行(举个例子,OTucsonDE昂Cora BY
      key_part_1,key_part_二),排序或分组三个表。就算具有键值部分跟随DESC,键以倒序被读取。
    • 在有的情形中,一个询问能被优化来找寻值,不用咨询数据文件。即使对一些表的装有应用的列是数字型的还要结合某个键的最左侧前缀,为了更加快,值能够从索引树被搜寻出来。

      倘若你发出下列SELECT语句:

      mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
      

      若果二个多列索引存在于col壹和col二上,适当的行可以平素被抽出。假若分别的单行列索引存在于col一和col2上,优化器试图透过操纵哪些索引将找到越来越少的行并来搜索更具限制性的目录并且应用该索引取行。

    开采人士做 SQL 数据表设计的时候,一定要通盘怀恋清楚。

迅猛找寻十三分2个WHERE子句的行
当实行统壹(JOIN)时,从此外表检索行。
对特定的索引列找寻MAX()或MIN()值
如若排序或分组在一个可用键的最左侧前缀上进行(比如,O本田UR-VDE奥迪Q三 BY
key_part_1,key_part_2),排序或分组1个表。若是具有键值部分跟随DESC,键以倒序被读取。
在部分动静中,3个询问能被优化来找寻值,不用咨询数据文件。如若对某个表的具备应用的列是数字型的还要结合有些键的最左侧前缀,为了更快,值能够从索引树被搜寻出来。

您大概感兴趣的稿子:

  • mysql5.七.1八解压版运转mysql服务
  • mysql服务运转不了化解方案
  • mysql服务十67荒唐三种消除方案分享
  • windows七下运转mysql服务出现服务名无效的来由及减轻格局
  • 解决 phpmyadmin #2000 不能够登陆 MySQL
    服务器
  • mysql服务器询问慢原因剖判与解决方法小结
  • CentOS
    柒下MySQL服务运行战败的急速消除形式
  • phpmyadmin报错:#2003 不能够登入MySQL服务器的缓慢解决措施
  • mysql
    服务意外停止拾陆7荒唐消除办法小结
  • mysql五.七.1八设置时mysql服务运营战败的缓慢解决方法

万壹你生出下列SELECT语句:

mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
若是叁个多列索引存在于col一和col贰上,适当的行能够间接被收取。要是分其他单行列索引存在于col壹和col2上,优化器试图通过调控哪些索引将找到越来越少的行并来找寻更具限制性的目录并且选择该索引取行。

  开采人士做 SQL 数据表设计的时候,一定要通盘思量清楚。

CPU 占用 百分百 的场地描述
深夜帮朋友1台服务器化解了 Mysql cpu 占用 百分百的主题素材。稍整理了眨眼之间间,将经历记录在那篇小说里 朋友主机(…

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注