Mysql优化

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存储引擎管理,使用动态宽度的行格式,


你可能感兴趣的:(Mysql优化)