请教两个关于MySQL的性能调校及索引问题

wasuka 2010-04-12 10:38:38
问题1:

MySQL版本是5.1.37-1ubuntu5,执行UPDATE很慢,SHOW PROCESSLIST看到SQL的State是“freeing items”,大部分时间都花在了这步。请教如何解决?


==============================================================


问题2:

MySQL版本是5.0.75-0ubuntu10.3,两个数据表,结构如下:

CREATE TABLE A
(
ID MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
BID MEDIUMINT(8) UNSIGNED NOT NULL
)
ENGINE = InnoDB;

CREATE TABLE B
(
ID MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
AID MEDIUMINT(8) UNSIGNED NOT NULL
)
ENGINE = InnoDB;

两表数据量相同,都是100万;
执行SQL“ALTER TABLE A ADD PRIMARY KEY (ID, BID), ADD INDEX (BID)”,大约用时5分钟;
执行SQL“ALTER TABLE B ADD PRIMARY KEY (ID, AID), ADD INDEX (AID)”,大约用时8小时,过程中使用SHOW PROCESSLIST查看State为“copy to tmp table”。
请教,两表结构相同、数据也大致相同,为什么耗时相差悬殊、如何解决?


谢谢!
...全文
261 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
WWWWA 2010-04-16
  • 打赏
  • 举报
回复
都是在同一块硬盘上?
wasuka 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 xys_777 的回复:]

执行SQL“ALTER TABLE A ADD PRIMARY KEY (ID, BID), ADD INDEX (BID)”,大约用时5分钟;
执行SQL“ALTER TABLE B ADD PRIMARY KEY (ID, AID), ADD INDEX (AID)”,大约用时8小时;

创建索引和数据有很大关系,看看两个表的数据什么区别。
[/Quote]


没有什么太大的区别,都是整数,AID和BID分别对应另外两表的ID。
wasuka 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 wwwwa 的回复:]

都是在同一块硬盘上?
[/Quote]

是的
wasuka 2010-04-15
  • 打赏
  • 举报
回复
是在一台机器上。分析后结果依旧。
永生天地 2010-04-15
  • 打赏
  • 举报
回复
执行SQL“ALTER TABLE A ADD PRIMARY KEY (ID, BID), ADD INDEX (BID)”,大约用时5分钟;
执行SQL“ALTER TABLE B ADD PRIMARY KEY (ID, AID), ADD INDEX (AID)”,大约用时8小时;

创建索引和数据有很大关系,看看两个表的数据什么区别。
shenshine 2010-04-14
  • 打赏
  • 举报
回复
要不这样吧,你先分析下表然后再执行看看:

analyze table b;

shenshine 2010-04-14
  • 打赏
  • 举报
回复
看了下你贴出的结果,没什么差别啊,就是b表的非主键索引的Cardinality比a表的小,但这个应该不会导致你这个明显问题啊,很奇怪

对了,你2个语句是在同一机器上面执行的?
wasuka 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wwwwb 的回复:]

是同一数据库的表?你新建一个数据库,将B表导入,再测试一下,看看是否是硬盘的问题
[/Quote]

这样快了很多,大约用了3个小时。
wasuka 2010-04-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 acmain_chm 的回复:]

两表数据量相同,都是100万;
执行SQL“ALTER TABLE A ADD PRIMARY KEY (ID, BID), ADD INDEX (BID)”,大约用时5分钟;
执行SQL“ALTER TABLE B ADD PRIMARY KEY (ID, AID), ADD INDEX (AID)”,大约用时8小时,过程中使用SHOW PROCESSLIST查看State为“copy t……
[/Quote]

没有,只有当前SQL在执行。
现在的情况是表没有索引,导入数据后建立索引,耗时8小时;如果索引是之前就建好的,倒数据一样也需要8小时左右。
wasuka 2010-04-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 acmain_chm 的回复:]

MySQL版本是5.1.37-1ubuntu5,执行UPDATE很慢,SHOW PROCESSLIST看到SQL的State是“freeing items”,大部分时间都花在了这步。请教如何解决?

具体语句是什么?有没有where 从句? 如果没有,则是全表更新,速度不会太快,并且受锁的影响。
[/Quote]

不论是什么语句,比如“UPDATE table SET filed = field + 1”或者“UPDATE table SET filed = field + 1 WHERE ID = 1”,都会有“freeing items”占用大量时间。
而且,相同的表和数据,在另一台服务器上执行就没有上述问题。
ACMAIN_CHM 2010-04-12
  • 打赏
  • 举报
回复
两表数据量相同,都是100万;
执行SQL“ALTER TABLE A ADD PRIMARY KEY (ID, BID), ADD INDEX (BID)”,大约用时5分钟;
执行SQL“ALTER TABLE B ADD PRIMARY KEY (ID, AID), ADD INDEX (AID)”,大约用时8小时,过程中使用SHOW PROCESSLIST查看State为“copy to tmp table”。
请教,两表结构相同、数据也大致相同,为什么耗时相差悬殊、如何解决?


检查一下有没有其它进程锁住了这个表。
ACMAIN_CHM 2010-04-12
  • 打赏
  • 举报
回复
MySQL版本是5.1.37-1ubuntu5,执行UPDATE很慢,SHOW PROCESSLIST看到SQL的State是“freeing items”,大部分时间都花在了这步。请教如何解决?

具体语句是什么?有没有where 从句? 如果没有,则是全表更新,速度不会太快,并且受锁的影响。
wasuka 2010-04-12
  • 打赏
  • 举报
回复
单独执行是什么意思?有100万数据的情况下,至少8小时。
WWWWA 2010-04-12
  • 打赏
  • 举报
回复
如果单独执行ALTER TABLE B ADD PRIMARY KEY (ID, AID), ADD INDEX (AID)
这句,要多长时间
wasuka 2010-04-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwwwa 的回复:]

数据量有多大?
[/Quote]

问题1中情况我只测试了一个表,大约12000条数据。
同样的表、数据和操作,如果在其它服务器上执行是正常的。
WWWWA 2010-04-12
  • 打赏
  • 举报
回复
数据量有多大?
wasuka 2010-04-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 acmain_chm 的回复:]

这样

show create table a;
show create table b;
show index from a;
show index from b;
SHOW TABLE STATUS like 'a';
SHOW TABLE STATUS like 'b';


贴出来看一下
[/Quote]


show create table a;

CREATE TABLE `a` (
`ID` smallint(5) unsigned NOT NULL,
`BID` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`ID`,`BID`),
KEY `BID` (`BID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

==========================================

show create table b;

CREATE TABLE `b` (
`ID` mediumint(8) unsigned NOT NULL,
`AID` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`ID`,`AID`),
KEY `AID` (`AID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

==========================================

show index from a\G

*************************** 1. row ***************************
Table: a
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: ID
Collation: A
Cardinality: 4287
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
*************************** 2. row ***************************
Table: a
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 2
Column_name: BID
Collation: A
Cardinality: 1080549
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
*************************** 3. row ***************************
Table: a
Non_unique: 1
Key_name: BID
Seq_in_index: 1
Column_name: BID
Collation: A
Cardinality: 28435
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:

==========================================

show index from b;

*************************** 1. row ***************************
Table: b
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: ID
Collation: A
Cardinality: 33315
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
*************************** 2. row ***************************
Table: b
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 2
Column_name: AID
Collation: A
Cardinality: 1066089
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
*************************** 3. row ***************************
Table: b
Non_unique: 1
Key_name: AID
Seq_in_index: 1
Column_name: AID
Collation: A
Cardinality: 1773
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:

==========================================

SHOW TABLE STATUS like 'a'\G

Name: a
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 1055536
Avg_row_length: 27
Data_length: 28901376
Max_data_length: 0
Index_length: 19415040
Data_free: 0
Auto_increment: NULL
Create_time: 2010-04-12 09:11:29
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment: a; InnoDB free: 4096 kB

==========================================

SHOW TABLE STATUS like 'b';

Name: b
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 1190545
Avg_row_length: 47
Data_length: 56197120
Max_data_length: 0
Index_length: 13123584
Data_free: 0
Auto_increment: NULL
Create_time: 2010-04-12 15:07:18
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment: b; InnoDB free: 4096 kB
ACMAIN_CHM 2010-04-12
  • 打赏
  • 举报
回复
这样

show create table a;
show create table b;
show index from a;
show index from b;
SHOW TABLE STATUS like 'a';
SHOW TABLE STATUS like 'b';


贴出来看一下
wwwwb 2010-04-12
  • 打赏
  • 举报
回复
是同一数据库的表?你新建一个数据库,将B表导入,再测试一下,看看是否是硬盘的问题
wasuka 2010-04-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wwwwb 的回复:]

引用 4 楼 wasuka 的回复:
单独执行是什么意思?有100万数据的情况下,至少8小时。

你是先执行
“ALTER TABLE A ADD PRIMARY KEY (ID, BID), ADD INDEX (BID)”
再执行
SQL“ALTER TABLE B ADD PRIMARY KEY (ID, AID), ADD INDEX (AID)”


还是分别单独执……
[/Quote]


单独执行试过了,ALTER TABLE B依然很慢。
加载更多回复(3)

56,875

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧