本帖最后由 ss0111ss 于 2011-09-07 14:34:26 编辑

解决方案 »

  1.   

    你的理解没错,但对大多数使用者来说16K是大了点,对I/O影响很大很多资深人士都是修改MySQL源码,改小后重新编译的。
      

  2.   

    如果你的数据库面临的都是18K的数据写操作的话,你不妨改一下分页大小试试或者检查一下innodb_flush_log_at_trx_commit,这个对大批量写操作的速度提高不是一点点。
      

  3.   

    难,这个16K也是为了和操作系统配合,很多操作系统的操作单位簇,就是16K或者8K。
      

  4.   

    我们都知道mysql Innodb存储的时候,是按16kb分页(或称之为“块”)进行存储的。现在我存入一个longtext类型,比如大小是2M,大于16kb的,在存储的时候,就是按照划分2*1024/16(取上整数)个页(或块)进行存储的吗?回:2*1024/16=128页。如果这2M是表创建后第一次存储,那么首先需要用完32个碎片页,发现不够,然后再一次性申请64个连续页,发现还是不够,再申请64个页,这次够了。2M存入后,会有32个页是空闲的,如果下次插入低于32个页,就不需要再申请页了(表现为数据文件大小不再增加)。再比如我现在要存储一个18kb的东西,为了优化数据库,我有没办法即要把数据存入数据库,但又不存在跨页的情况存储?回:18K超出一个页的大小,肯定要跨页了。但是如果是2个连续页,跨页也不会给存储造成影响。
      

  5.   

    18/16=9:8,MYSQL申请页时是一次性连续的64个页,64/8=8,8*9=72
    存储时,一次性存入72条记录(insert into a values(1),(2)...(72)),这样申请空间时,一个插入,申请一次连续的64页,72条记录都是顺序存储的。上面是我的猜想,需要验证。
      

  6.   


    比较郁闷的是,DBA那边如果出现跨页存储的情况,他们不让通过,所有就得想想解决办法。
      

  7.   


    表的列足够多,多得跨页,这种情况是允许的。
    但是,有一种情况是不允许不被推荐的,就是所有非BLOB/CLOB列的字段长度之和超过一页大小,这样,对性能影响很大。
    BLOB/CLOB,在大多数数据库,都使用单独的BLOB、CLOB页来进行管理。
      

  8.   


    我看到希望了,大侠能详细讲解下“在大多数数据库,都使用单独的BLOB、CLOB页来进行管理”么?谢谢!