- 论坛徽章:
- 0
|
mysql tmp_table_size 这个变量决定了内存中临时表的大小,每个线程都有一个。如果表变得特别大,myisam表就会被建在磁盘上。 优化查询语句的时候,要避免使用临时表,如果实在避免不了的话,要保证这些临时表是存在内存中的。 查看带临时表的查询语句的执行过程,这样你就可以得到需要改进的临时表。需要注意的是临时表的内 存大小是为每个线程都分配的。 如果你有复杂的查询语句,sort_buffer_size和tmp_table_size就可能非常有用。 如果临时myisam表,小于或等于tmp_table_size的时候,MySQL就会把它保存在内存中,否则,就会把这 些数据写到磁盘上,需要的时候重新读取。如果需要的空间超过了tmp_table_size的大小,MySQL就会在 tmpdir目录下创建基于磁盘的表。 怎样觉得tmp_table_size的大小: 对比Created_tmp_tables和Created_tmp_disk_tables计数器。如果Created_tmp_tables不比Created_tmp_disk_tables 大的多的话(比如大约20被:5%),你就需要增加Created_tmp_tables的值。大致目标是: Created_tmp_disk_tables是Created_tmp_tables的2%.
我的值是: tmp_table_size(默认32M)=128M(之前1:96M有15% 之前2:128M有2%的比率建在磁盘上) max_heap_table_size=default 16MB(和tmp_table_size一样的heap类型表) read_buffer_size(默认128KB)=2M 尝试4M(my-huge 建议2M) sort_buffer_size=6M(之前:4M,my-huge 建议2M) 改进大的复杂的排序语句,每个线程都需要分配排序buffer大小,如果想要order by或group by 更快的话,增加这些值。 read_rnd_buffer_size(dafault 126-256KB 范围)=4M(之前:2M) 当排序后以排序后的顺序读取行时,这些行在buffer里存着,避免搜索磁盘。设置这个值大些,能相当地改进 order by的性能。 join_buffer_size(默认128KB)=2M 尝试4M max_tmp_tables(默认32)=64 同一时刻,一个客户端能保持打开临时表的最大个数。 myisam_sort_buffer_size=64M 这个buffer被分配的情况是在repair table期间排序MYISAM索引或者create index或者alter table时创建索引。 注意:这些是"每个连接"的值,read_buffer_size,read_rnd_buffer_size和一些其它的值,意思是这些值可能 是每个连接都需要的。所以,当设置这些参数的时候,考虑你的负载和可变资源。例如,sort_buffer_size只有在 MySQL排序的时候,才被分配。 重要提示:不要耗尽memory。
如果一个内部heap表超过了tmp_table_size的大小,MySQL就会自动把内存中的heap表创建到磁盘上。你也可以增加 tmp_table_size的值,或者在客户端程序中,设置SQL选项:SQL_BIG_TABLES。 |
|