测试中有100万条数据, 就一个表:create table user
(idx int ,
id varchar(63) not null,
passwd varchar(63) not null, primary key(idx),
unique(id));测试遍历查询一次所有的数据(据 idx 来查), 如 select * from user where idx = 2; 现在所需时间是 120 秒左右. 为什么时间会这么长呢? 我看了下, 数据库的大小只有 50M 左右. 我尝试把 user 表分成 10 个,20 个表, (据 idx % 10, idx % 20 来分), 发现几乎没什么效果. 还有其它优化方法不?
(idx int ,
id varchar(63) not null,
passwd varchar(63) not null, primary key(idx),
unique(id));测试遍历查询一次所有的数据(据 idx 来查), 如 select * from user where idx = 2; 现在所需时间是 120 秒左右. 为什么时间会这么长呢? 我看了下, 数据库的大小只有 50M 左右. 我尝试把 user 表分成 10 个,20 个表, (据 idx % 10, idx % 20 来分), 发现几乎没什么效果. 还有其它优化方法不?
的结果。
-> ;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| idx | int(11) | NO | PRI | 0 | |
| id | varchar(63) | NO | UNI | | |
| passwd | varchar(63) | NO | | | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)所以那条 alter 语句会出错, 说定义多个主键.mysql> explain select * from user0 where idx=0;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | user0 | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)mysql>
这条数据执行要120秒?看你explain的结果可能0.00sec就查出来了。只检索了一行啊。
不用执行那么久吧。如果要那么久还有人用mysql?一百多万数据很多系统都有的。
你的explain结果,是最优的查询了,type也是const的。
if(!exists()) // select
insert();要求让这个循环尽可能快的结束. 看来 exists() 那边好像是没什么方法优化了. 如果考虑 insert 语句,将它先写到文件里, 最后一块从文件从入到数据库, 效果应该不错. 只是有一个问题就是; 如何保证 exists() 调用的时候, 除了查数据库名, 还得查文件 cache. 看起来有些吃力不讨好? 有什么好的建议不?
你的需求我实在搞不懂。