新手学习MySQL,LinuX下建表如下:NAME(CHAR32)、STR1(CHAR32)......STR10(CHAR32)选择NAME域做Primary索引;
当采用顺序加入、查询、修改或删除(如Name依次取取Id000000、Id000001......Id199999)时速度可以,大约30s~40s左右可以完成20万条;可是当打乱顺序访问(Name随机取IdXXXXXX)时,性能下降很厉害,一般下降3~5倍,偶尔也有下降将近10倍的,感觉是和索引乱序使用有关,但如何优化呢?使用的是Linux,引擎是MyISAM,客户端采用C API访问;
试过将索引域改为BigINT,问题依旧,自己加了Linux的取操作时间打印,最慢的结果竟有1s多才返回的!

解决方案 »

  1.   

    这是因为PRIMARY索引本身内部结构就是顺序存储,如果你插入是乱序,每次操作,索引结构本身就会自动调整,所以会带来性能的影响
      

  2.   

    如果你是按序插入的,那么B树的更新操作会快得多。(树的添加节点以及节点分裂)
    建议你看看数据结构中B-树以及B+树的基本算法。
      

  3.   

    你具体的select 语句是什么?另外给出你的 show create table xxx;
     show index from xxxx;
    explain select ....
      

  4.   

    又运行了一遍测试集Query/Modify/Delete,证实QUERY操作受这个乱序影响很小,基本以忽略;
    但Modify和Delete的确影响很大,Modify大约慢了6倍,Delete则大约慢了10倍!
      

  5.   

    经过测试,确认是磁盘IO问题,这种乱序模式下访问磁盘速度较慢!
    将全部20万条数据换为Memory引擎加入内存后,再访问就速度飞快;最后来了一把彻底的,将机器上的Linux升级到2.6.29,文件系统由Ext3换为Ext4,再测试,发现乱序性能竟然好得很,不仅恢复到原先的情况,某些情况下甚至比顺序稍好,看来Ext3支持MySQL是不行啊!