mysql单表1000万条_mysql单表千万条数据测试

软件环境:win7,mysql版本5.5,InnoDB存储引擎。

硬件环境:普通笔记本,CPU P8700双核2.53GHz,内存3G,5400转机械硬盘1000GB。

建了一张表,id列是自增长bigint,再加上其他varchar、datetime型的字段,总共8个字段,通过java生成了insert的sql文件,一共62个文件,每个文件50万行(约88M),总共3100万行记录(约5.35G),通过source导入,从中午1:30一直到18:00才导完,花了快4个半小时,导完后,数据文件大小约2.5G。后来听说用load data infile可以加快导数据时间,改天再试试。

结论1:由此可见,mysql单表支持1000万条数据是完全可行的。

此时只有id列上有主键,聚集索引,测试开始。

1、整表数据行数统计(select count)

select count(*) from t_test;

返回3100万条数据足足花了1分21秒,多次测试取平均值,也差不多要1分6秒。

select count(n_id) from t_test;

返回3100万条数据也要1分多,感觉比count(*)性能好不了多少,难道是数据量级还不够大?

给n_id建了一个非聚集索引,create index idx_nid on t_test(n_id) 耗时4分43秒。

再次 select count(n_id) from t_test;

返回3100万条数据耗时13.52秒;快了不少!

select count(*) from t_baginfo;

返回3100万条数据耗时12.86秒;比count(n_id)快约700毫秒;

结论2:在只有聚集索引的情况下,再给主键列建一个非聚集索引后,select count(*)速度可以得到很大提升

2、分页测试

a、取1万行后面10行记录:

select * from t_test limit 10000,10;耗时0.03秒

只取n_id

select n_id from t_test limit 10000,10;耗时0.01秒

b、取10万行后面10行记录:

select * from t_test limit 100000,10;耗时0.14秒

只取n_id

select n_id from t_test limit 100000,10;耗时0.08秒

c、取100万行后面的10行记录:

select * from t_test limit 1000000,10;耗时1.69秒

只取n_id

select n_id from t_test limit 1000000,10;耗时0.77秒

d、取1000万行后面的10行记录:

select * from t_test limit 10000000,10;耗时17.86秒

select * from t_test where n_id>(select n_id from t_test  limit 9999999,1 ) limit 10; 耗时18.27秒

加n_id排序:

select * from t_test order by n_id limit 10000000,10;耗时18.14秒

select * from t_test where n_id>(select n_id from t_test order by n_id limit 9999999,1 ) limit 10; 耗时18.27秒

只取n_id

select n_id from t_test limit 10000000,10;耗时4.22秒

select n_id from t_test where n_id>(select n_id from t_test  limit 9999999,1 ) limit 10; 耗时5.51秒

加n_id排序:

select n_id from t_test order by n_id limit 10000000,10;耗时17.25秒

select n_id from t_test where n_id>(select n_id from t_test order by n_id limit 9999999,1 ) limit 10; 耗时17.98秒

你可能感兴趣的:(mysql单表1000万条)