MySQL数据库优化--SQL
2007-02-13 10:53:51 来源:WEB开发网第三:
1:如果你在一个数据库中创建大量的表,那么执行打开,关闭,创建(表)的操作就会很慢. 2:mysql使用内存
a: 关键字缓存区(key_buffer_size)由所有线程共享
b: 每个连接使用一些特定的线程空间.一个栈(默认为64k,变量thread_stack),一个连接缓冲区(变量net_buffer_length)和一个结果缓冲区(net_buffer_length).特定情况下,连接缓冲区和结果缓冲区被动态扩大到max_allowed_packet.
c:所有线程共享一个基存储器
d:没有内存影射
e:每个做顺序扫描的请求分配一个读缓冲区(record_buffer)
f:所有联结均有一遍完成并且大多数联结甚至可以不用一个临时表完成.最临时的表是基于内存的(heap)表
g:排序请求分配一个排序缓冲区和2个临时表
h:所有语法分析和计算都在一个本地存储器完成
i:每个索引文件只被打开一次,并且数据文件为每个并发运行的线程打开一次
j:对每个blob列的表,一个缓冲区动态的被扩大以便读入blob值
k:所有正在使用的表的表处理器被保存在一个缓冲器中并且作为一个fifo管理.
l:一个mysqladmin flush-tables命令关闭所有不在使用的表并且在当前执行的线程结束时标记所有在使用的表准备关闭
3:mysql锁定表
mysql中所有锁定不会成为死锁. wirte锁定: mysql的锁定原理:a:如果表没有锁定,那么锁定;b否则,把锁定请求放入写锁定队列中
read锁定: mysql的锁定原理:a:如果表没有锁定,那么锁定;b否则,把锁定请求放入读锁定队列中
有时候会在一个表中进行很多的select,insert操作,可以在一个临时表中插入行并且偶尔用临时表的记录更新真正的表
a:用low_priority属性给一个特定的insert,update或者delete较低的优先级
b:max_write_lock_count指定一个值(通常很小)来启动mysqld,使得在一定数量的write锁定之后出现read锁定
c:通过使用set sql_low_priority_updates=1可以从一个特定的线程指定所有的更改应该由较低的优先级完成
d:用high_priority指定一个select
e:如果使用insert....select....出现问题,使用myisam表------因为它支持因为它支持并发的select和insert
4:最基本的优化是使数据在硬盘上占据的空间最小.如果索引做在最小的列上,那么索引也最小.实现方法:
a:使用尽可能小的数据类型
b:如果可能,声明表列为NOT NULL.
c:如果有可能使用变成的数据类型,如varchar(但是速度会受一定的影响)
d:每个表应该有尽可能短的主索引 e:创建确实需要的索引
f:如果一个索引在头几个字符上有唯一的前缀,那么仅仅索引这个前缀----mysql支持在一个字符列的一部分上的索引
g:如果一个表经常被扫描,那么试图拆分它为更多的表
更多精彩
赞助商链接