一个简单的查询,select count(*)  from table1  where result like "%ahfdsd%";特地不用索引来全盘扫描一张表,来测试mysql 的查询性能,result 是 text字段,没有索引。发现CPU的利用率30左右,内存占用较少,耗时31秒。搞笑的是,当我修改result的匹配值,多次执行该查询时,发现耗时42秒。
     当我设置 flush_time=50,以后的连续查询也只要31秒,可flush_time=50是每隔50秒关闭所有不用的表,而我接下来的查询都是要打开同一张表的啊,按理说,flush后重新打开表,查询需要的时间更长才对啊,郁闷。
     还有增大 read_buffer_size的值,read_buffer_size=1M, 查询性能反而下降,要45秒。我的配置是:windows 2003,mysql 5.1,CPU 2.0G ,内存 2.0G;机器只运行mysql。
数据库中只有一张表 有1000万条记录,大小是2.03G;
my.ini的主要配置:table_cache 是256,read_buffer_size=32K ,key_buffer_size=595M,引擎是myisam。
测试是在服务器的mysql client 端执行的SQL语句。大家说说自己的看法啊

解决方案 »

  1.   

    like "%ahfdsd%",你是否建立索引,数据库都不会使用索引的。你发送sql到服务器,数据库会对你的sql进行优化,生成它认为最好的执行计划,当你下一次去使用相同的sql的时候,数据库不会对你的sql在进行优化了,直接使用以前的(就是说节省了一步)所以快一些。read_buffer_size这个参数不太明白,看文档是说“请求将分配一个缓存区”,如果我理解的不错,当你把这个增大,那么,请求的命中率就降低了,所以会变慢。
      

  2.   

    楼上的,我并不是重复执行原来的select语,我修改了result的匹配值,它会重新优化吗?
      

  3.   

    你修改了数据库的字段值,数据库不会对sql进行从新优化,因为优化是基于开销,或者是其他的,你只是修改了一个字段的值,那么应该不会从新进行优化(我个人是这样认为的)
      

  4.   

    http://blog.chinaunix.net/u/29134/showart_264480.html
      

  5.   

    因为你的数据量太大,而又使用不了索引(like '%XXXXX' 是不会使用索引的),MySQL只能使用自身的加速查找算法。缓存是帮不了你什么忙的,其大数据量还是得依靠硬盘。
    CPU的占用率低,但是,硬盘可是在疯狂转呀,如果,硬盘不转的话,估计CPU的占用率绝对在95%以上。(等待系统总线,硬盘接口和硬盘内部数据读取速度与CPU一级缓存速度一致的情况下再测试吧)楼主的这个测试,估计缓存的命中率还是很高的。保守估计在99.5%以上。
      

  6.   

    楼上的,你说的话我很认同。不过,增大缓存可以 成倍 的减少磁盘的读取次数。按理说,速度应该快一些,可是反而慢下来了?我有两个CPU,不知有没有帮助?