Hello mysql,
I'm repeating my test's now with more information and on more
powerfull maching with no load now, this should give more accurate
results.
The machine is Dual PIII-750/1GB RAM
I'm trying the following table structure:
CREATE TABLE g00hits (
id int(10) unsigned NOT NULL auto_increment,
counter_id int(10) unsigned NOT NULL default '0',
visitor_id int(10) unsigned NOT NULL default '0',
server_id smallint(5) unsigned NOT NULL default '0',
ip int(10) unsigned NOT NULL default '0',
ts timestamp(14) NOT NULL,
method_id tinyint(3) unsigned NOT NULL default '0',
http_ver_id tinyint(3) unsigned NOT NULL default '0',
page_id int(10) unsigned NOT NULL default '0',
referer_page_id int(10) unsigned NOT NULL default '0',
status smallint(5) unsigned NOT NULL default '0',
bytes int(10) unsigned NOT NULL default '0',
browser_id mediumint(8) unsigned NOT NULL default '0',
language smallint(5) unsigned NOT NULL default '0',
local_visitor_id bigint(10) unsigned NOT NULL default '0',
process_time int(10) unsigned NOT NULL default '0',
proxy_software_id mediumint(8) unsigned NOT NULL default '0',
proxy_client_ip int(10) unsigned NOT NULL default '0',
auth_user_id int(10) unsigned NOT NULL default '0',
flag int(10) unsigned NOT NULL default '0',
session_id int(10) unsigned NOT NULL default '0',
doc_type smallint(5) unsigned NOT NULL default '0',
online_users smallint(5) unsigned NOT NULL default '0',
src_id int(10) unsigned NOT NULL default '0',
PRIMARY KEY (counter_id,ts,id),
KEY visitor_id (visitor_id)
) TYPE=MyISAM PACK_KEYS=1 DELAY_KEY_WRITE=1;
which has:
mysql> select count(*) from g00hits;
+----------+
| count(*) |
+----------+
| 3722867 |
+----------+
1 row in set (0.01 sec)
MYD file takes 300MB, text output 400MB
With mysqldump which uses the following query to do this:
SELECT * INTO OUTFILE '/spylog/test/g00hits.txt' FROM g00hits
It takes:
real 1m23.177s (first time)
real 1m20.934s (second time)
The backup table for the same table takes:
first time:
mysql> backup table g00hits to '/spylog/test';
+--------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------+--------+----------+----------+
| la00.g00hits | backup | status | OK |
+--------------+--------+----------+----------+
1 row in set (22.60 sec)
second time:
mysql> backup table g00hits to '/spylog/test';
+--------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------+--------+----------+----------+
| la00.g00hits | backup | status | OK |
+--------------+--------+----------+----------+
1 row in set (21.34 sec)
Well. We have 4 times difference here, which is a bit strange as I
would expect the disk speed should be the limit here, but not
converting the rows in text format, which is in this case done at
speed of 45000rows/second, which is not really much I think for this
type of operation. Hope mysql does not use strcat to form the strings?
Well. Let's try to do the restore:
mysql> restore table g00hits from '/spylog/test';
+--------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------+---------+----------+----------+
| test.g00hits | restore | status | OK |
+--------------+---------+----------+----------+
1 row in set (1 min 31.16 sec)
and again:
mysql> restore table g00hits from '/spylog/test';
+--------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------+---------+----------+----------+
| test.g00hits | restore | status | OK |
+--------------+---------+----------+----------+
1 row in set (1 min 30.41 sec)
mysql> load data infile '/spylog/test/g00hits.txt' ignore into table g00hits;
Query OK, 3722867 rows affected (8 min 35.73 sec)
mysql> load data infile '/spylog/test/g00hits.txt' ignore into table g00hits;
Query OK, 3722867 rows affected (3 min 35.26 sec)
So it seems like cache really matters here, this would indicate bad
disk access way as this difference is to huge and is not found with
backup/restore table.
Now without ignore:
mysql> load data infile '/spylog/test/g00hits.txt' into table g00hits;
Query OK, 3722867 rows affected (3 min 34.75 sec)
So it seems like it does not really matter.
Well let's drop all indexes and try to load data fastest way ?
mysql> load data infile '/spylog/test/g00hits.txt' ignore into table g00hits;
Query OK, 3722867 rows affected (1 min 56.16 sec)
Records: 3722867 Deleted: 0 Skipped: 0 Warnings: 0
mysql> load data infile '/spylog/test/g00hits.txt' into table g00hits;
Query OK, 3722867 rows affected (1 min 56.38 sec)
Records: 3722867 Deleted: 0 Skipped: 0 Warnings: 0
mysql> alter table g00hits add primary key(counter_id,ts,id),add key(visitor_id);
Query OK, 3722867 rows affected (1 min 54.38 sec)
Records: 3722867 Duplicates: 0 Warnings: 0
So it does not give any improvement do add keys after loading date, it
seems to be allready optimal.
So the diference in restore speed is about 3 times, which is not
really expected, but a bit better then I reported before, but anyway I
can't understand so huge difference for load data then text file fits
to cache or does not. Well may be it was because of some other random
events - I was not able to reproduce so slow speed anymore.
also look at the difference of vmstat between restore and load data:
restore:
0 1 1 181624 42456 196488 206936 0 0 2823 4208 1126 1151 0 25 74
0 1 0 181624 24472 222220 199332 0 0 3411 3903 1144 1273 0 25 74
1 0 1 181624 30640 104856 268544 0 0 7030 371 682 792 29 24 47
1 0 0 181624 30636 104856 268544 0 0 0 0 104 115 50 0 50
1 0 0 181624 21108 104848 269308 0 0 0 0 104 114 50 0 49
So the file is copied quickly and then indexes are generated so one
CPU is completely out:
LOAD DATA:
2 1 0 181624 75816 166460 180356 0 0 425 223 411 8798 29 6 65
0 1 0 181624 68256 168944 185312 0 0 435 407 608 2827 10 5 85
1 1 0 181624 63676 171668 189108 0 0 388 363 656 7937 19 7 74
1 0 0 181624 23976 104856 245228 0 0 0 0 106 116 50 0 50
1 0 0 181624 23976 104856 245228 0 0 0 0 104 113 50 0 49
1 0 0 181624 29980 131516 212568 0 0 0 0 104 114 48 3 50
as you see the CPU is not really used, therefore the disk access is
not so huge, this may indicate the disk is bein accessed in random
order, therefore it should not i think. This may indicate to small
buffer used (?) my record_buffer is set to 512K by the way.
--
Best regards,
Peter mailto:[EMAIL PROTECTED]
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php