mysql的优化就是尽可能的让mysql干活,能不做的操作就避免掉,缩小表的大小,让数据的存储尽可能的紧凑。
对于表的列
1使用最有效的数据类型,比如mediumint比int是更好的选择,mediumint列使用的空间能少25%的大小。
2尽可能的声明列是非空的,这样让索引更好的被使用
在一个字符串的列,如果第一位字符有唯一标识,可以使用mysql的列最左侧索引,这样索引会更小,速度更快。
3尽可能保持表列的短小,字段太多,但是查询的时候很少用到的就拆除去,用到的时候做个关联。
mysql是多线程的,所以可能同时会有很多的客户端去同时访问同一个表,为了减少多客户端会话访问同一个表的不同状态问题,表被每个并发的会话单独的打开。这样增加了额外的内存,但是提升了性能。
table_open_cache和max_connnections系统变量影响了服务器打开的最大文件数量。如果你增加了一个变量或 这2个值,可以增加操作系统限制的每个进程打开的文件描述符。table_open_cache跟max_conections是有关联的,比如对200个并发的连接,指定表的缓存至少是200*n,n是连接中的表数量。
mysql会在下面的情况下关闭不适用的表并在缓存中移除它
1当缓存满了并且线程试着打开一个不再缓存中的表。
2当缓存大于table_open_cache,并且缓存中的表不再被使用的时候
3当表刷新操作发生的时候,flush tables。
可以通过查看状态变量opened_tables来确定表缓存是否设置的太小了,如果这个变量增加的很快,并且没有使用flush table语句,那么可能就是太小了。
服务器在下面的条件下会创建临时表
1评估union语句
2评估一些视图,例如union或聚合的语句
3评估被驱动表(在from后的子查询)
4为子查询创建的表或被连接的物化
5一些包含orderby的语句或group by的语句
6distinct和order by的组合
7使用了sql_small_result选项的查询
8多表的update
9group_concat()或count(distinct)
如果一个内部的临时表被创建变的很大了,mysql自动的将他们转换到磁盘上,内存中最大的大小是tmp_tbale_size和max_heap_table_size中的较小者,
如果服务器创建了一个内布标,它会增加created_timp_tables状态变量,如果服务器在磁盘上创建了表,会增加creaed_tmp_disk_tables状态变量。
内存中临时表被memory存储引擎管理,使用固定长度行格式。在磁盘上的临时表被myisam存储引擎管理,使用动态宽度的行格式,