Chinaunix
标题:
Mysql内存表select问题
[打印本页]
作者:
tchhyc
时间:
2009-07-02 15:22
标题:
Mysql内存表select问题
在测试Mysql内存表的过程中,insert10万条记录后,再一条条delete掉,相当于表里没记录,执行10次select操作,很慢,需要1000秒左右的时间,如果表里有记录,执行10万次,只要几十秒就执行完了。在测试过程中,如果往内存表里插入1条记录,select性能就会提高很多。
不知道大家有没有碰到过,目前操作主要就一张表,同时在线数大致也就10万最多了,select,insert,update操作并发很多,目前mysql有点支撑不住,想换内存表,现在做了些内存表测试,感觉有些地方怪怪的,内存表是否有哪些需要注意的,哪位熟悉的讲下。
作者:
tchhyc
时间:
2009-07-02 15:42
对比过status,主要就Handler_read_rnd_next 这个参数变化很大,根据查的资料,说扫描次数太多,需要优化sql本身,利用explain分析,表里没数据的时候
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE noticed after reading const tables
有数据的时候就可以看到把索引利用起来,速度就很快
作者:
tchhyc
时间:
2009-07-02 15:46
利用profile分析,主要慢在statistics
+--------------------+-----------+
| Status | Duration |
+--------------------+-----------+
| (initialization) | 0.0000032 |
| Opening tables | 0.0000117 |
| System lock | 0.000004 |
| Table lock | 0.0000097 |
| init | 0.0000267 |
| optimizing | 0.0000215 |
| statistics | 0.012672 |
| preparing | 0.0000287 |
| executing | 0.000093 |
| end | 0.0000097 |
| query end | 0.0000077 |
| freeing items | 0.0000297 |
| closing tables | 0.0000117 |
| logging slow query | 0.0000037 |
+--------------------+-----------+
作者:
cenalulu
时间:
2009-07-02 20:55
我刚才重复了下楼主描述的操作(10w数量级),没有能够重现楼主所说的情况。
lz最好再详细说下你的过程是怎样的?那10个select的语句是啥?
从你的描述来看应该跟mysql内存中驻留的信息有关,大量的删除后,mysql不会及时的对表空间进行清理,或者没有update缓存的index。
insert一条记录后,进行了清理,从而解决了问题。
不过只是我的猜测。。。
作者:
bs
时间:
2009-07-02 22:36
内存表,不知道说什么好。。。。锁表问题的存在,性能好不到哪儿去
作者:
Coolriver
时间:
2009-07-02 23:52
内存表我一直也在用,没遇到这种奇怪的现象。在线用户我们存到内存表中,基本也在10W以上了。
作者:
leoxqing
时间:
2009-07-03 08:28
不知道各位的内存表是怎么实现数据同步的呢?我马上的几个项目都要用上内存表了!
作者:
urapple
时间:
2009-07-03 08:53
标题:
回复 #4 cenalulu 的帖子
楼主是不是在做并发操作,同时几十个一起select一个表?大家有没有这样试试?
作者:
tchhyc
时间:
2009-07-04 23:41
标题:
回复 #4 cenalulu 的帖子
while(i<=100000)
{
delete from table where name='' limit 1;
i++;
}
插入的时候也是用10万次循环插入到表中
10万次Insert后,调用10万次select 50秒左右,然后10万次delete后,内存表里没有记录,然后再执行10万次select,这个时候要消耗1000秒左右的时间。
测试了几次都是这样,在对空表执行10万次select过程中,如果插入1条记录,速度就会快起来。
过程分析的一些在上面列出的
作者:
tchhyc
时间:
2009-07-04 23:42
标题:
回复 #8 urapple 的帖子
不是并发,其实是串行的,只有执行好一次select后才会调用下一次select
while
select
作者:
tchhyc
时间:
2009-07-04 23:43
原帖由
bs
于 2009-7-2 22:36 发表
内存表,不知道说什么好。。。。锁表问题的存在,性能好不到哪儿去
我这边测试的结果是比普通表性能提升一倍左右,其他方面有没有其他问题还不知道
作者:
Coolriver
时间:
2009-07-05 10:58
使用内存表就是尽量让自已的业务能快点完成,所以对于业务精小是一定要做到。从而减少每个对MySQL的操作锁表的可能。
合理调整一下自已的索引再试一下。
作者:
sunnyfun
时间:
2009-07-06 13:32
内存表默认使用哈希散列索引把数据保存在内存中,如果你在一个有高度键重复的(许多索引条目包含同一个值)内存表上有一个哈希索引,对影响键值的表的更新及所有删除都是明显地慢的。这个变慢的程度比例于重复的程度(或者反比于索引cardinality)。你可以使用一个B树索引来避免这个问题。
比如这样:
CREATE TABLE memtalbe
(id INT, INDEX USING BTREE (id))
ENGINE = MEMORY;
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2