12下一页
返回列表 发新帖

MySQL数据库优化的具体方法说明

3,486.3k 23
开着越野放牛 发表于 2013-6-14 21:07:48|湖北 | 查看全部 阅读模式
以下的文章主要讲述的是实现MySQL简单实用优化的具体方法,以及在实际操作中有哪些具体操作步骤是值得我们大家注意的。以下的文章主要描述的是MySQL数据库简单实用优化的具体方法的实现,中包括如何定期的表进行分析与检查,以及如何正确对表进行定期的优化,以下就是具体方案的描述,希望在你今后的学习中会有所帮助。
! R' h2 ^- {: |( O1、定期分析表和检查表 分析表的语法如下:
4 r: Z4 H6 }2 x; AANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name[, tbl_name]...
' J! X- z" Z1 _/ C, ~以上语句用于分析和存储表的关键字分布,分析的结果将可以使得系统得到准确的统计信息,使得SQL能够生成正确的执行计划。如果用户感觉实际执行计划并不是预期的执行计划,执行一次分析表可能会解决问题。在分析期间,使用一个读取锁定对表进行锁定。这对于MyISAM,DBD和InnoDB表有作用。例如分析一个数据表
( B7 A( a9 [* g. Z' Banalyze table table_name 检查表的语法如下: CHECK TABLE tb1_name[,tbl_name]...[option]...option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED} 检查表的作用是检查一个或多个表是否有错误,CHECK TABLE 对MyISAM 和 InnoDB表有作用,对于MyISAM表,关键字统计数据被更新 CHECK TABLE 也可以检查视图是否有错误,比如在视图定义中被引用的表不存在。
7 Z  W  z$ t/ ~2 A/ O6 `: H0 ^2. 定期优化表 优化表的语法如下:
- m; U6 \, Y" VOPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name [,tbl_name]... 如果删除了表的一大部分,或者如果已经对含有可变长度行的表(含有 VARCHAR、BLOB或TEXT列的表)进行更多更改,则应使用OPTIMIZE TABLE命令来进行表优化。这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费,但OPTIMIZE TABLE 命令只对MyISAM、 BDB 和InnoDB表起作用。 例如: optimize table table_name
, P' f4 M$ `2 @( j3 B) }% q1 h注意: analyze、check、optimize执行期间将对表进行锁定,因此一定注意要在MySQL数据库不繁忙的时候执行相关的操作。常用的SQL优化 我们在开发的时候常常用到的SQL语句,无非是INSERT、GROUPBY等等。对于这些SQL语句,我们怎么进行优化? 1. 大批量插入数据 当用load命令导入数据的时候,适当的设置可以提高导入的速度。6 c3 j% h$ d1 F+ e
对于MyISAM存储引擎的表,可以通过如下方式快速的导入大量的数据 ALTER TABLE tb1_name DISABLE KEYS;
+ n! y! `0 |) N$ a9 Cloading the data
$ L/ c2 f. s) ?: I; b* c- ^ALTER TABLE tb1_name ENABLE KEYS;- w4 G) k0 s( B$ y% o1 R
DISABLE KEYS 和 ENABLE KEYS 用来打开或者关闭MyISAM表非唯一索引的更新。在导入大量的数据到一个非空的MyISAM表时,通过设置这两个命令,可以提高导入的效率。) U# d( y. |0 L6 A
对于导入大量的数据到一个空的MyISAM表时,默认就是先导入数据然后才创建索引的,索引不用进行设置。; y" M. G- [; I
load data infile '/home/mysql/text_txt' into table text 对于InnoDB类型的表,这种方式不能提高导入数据的效率,但也有几种针对InnoDB类型的表进行优化的方式。 1. 因为InnoDB类型的表式按照主键的顺序保存的,所以将导入的数据按照主键的顺序排序,可以有效提高导入数据的效率。 2. 在导入数据前执行 SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET UNIQUE_CHECKS=1,恢复唯一性校验,可以提高导入的效率。 3. 如果应用使用自动提交的方式,建议在导入前执行SET AUTOCOMMIT=0,关闭自动提交,导入结束后执行SET AUTOCOMMIT=1,打开自动提交,也可以提高导入效率。优化INSERT语句( u* r( W0 s$ Y9 q
当进行数据INSERT的时候,可以考虑采用以下几种方式进行优化 1. 如果同时从一个客户插入很多行,尽量使用多个值表的INSERT语句,这种方式将大大缩短客户端与MySQL数据库的链接、关闭等消耗,使得效率比分开执行的单个INSERT语句快. 例如:
$ m$ c+ P, |3 o) O7 R/ s& qinsert into test values(1,2)
( j( s% c. P6 Hinsert into test values(3,4)
6 ^5 d- e8 W7 o5 Z* r# Uinsert into test values(5,6)4 X: e( S, z4 A+ Q' H
将上面三句改为:insert into test values(1,2),(3,4),(5,6)...... 2. 如果从不同客户插入很多行,能通过使用INSERT DELAYED 语句得到更高的速度。 DELAYED 的含义是让INSERT 语句马上执行,其实数据都被放在内存的队列中,并没有真正写入磁盘,这比每条语句分别插入要快得多;LOW_PRIORITY刚好相反,在所有其他用户对表的读写完后才进行插入。 3. 将索引文件和数据文件分在不同的磁盘上存放 4. 如果进行批量插入,可以增加bulk_insert_buffer_size变量值的方法来提高速度,但是,这只能对于MyISAM表使用。 5. 当从一个文本文件中装载一个表时,使用LOAD DATA INFILE。 这通常比使用很多insert语句快20倍左右。下面是mysql 性能优化的一些其它需要注意的地方,大家结合和,充分发挥mysql的性能。
+ o9 }8 t8 ?  z; F( e以下的文章主要向大家描述的是MySQL数据库优化,SQL的实际操作步骤,我们讲述的是MySQL数据库优化,SQL的三步骤,以下就是这三步骤的具体操作的详细描述,望你浏览之后会对其有所收获。
9 z% K( k5 z) lMySQL数据库优化--SQL第一步:0 I. O2 F" J( L$ g' N2 V
1:磁盘寻道能力,以高速硬盘(7200转/秒),理论上每秒寻道7200次.这是没有办法改变的,优化的方法是----用多个硬盘,或者把数据分散存储.* d9 g7 E" F3 H, r' m2 R. l
2:硬盘的读写速度,这个速度非常的快,这个更容易解决--可以从多个硬盘上并行读写./ g0 c8 k# Y. `) d
3:cpu.cpu处理内存中的数据,当有相对内存较小的表时,这是最常见的限制因素.  p: @4 ^" g( _  {
4:内存的限制.当cpu需要超出适合cpu缓存的数据时,缓存的带宽就成了内存的一个瓶颈---不过现在内存大的惊人,一般不会出现这个问题.
( x. i6 D1 D9 W5 K/ e5 M# oMySQL数据库优化--SQL第二步: (本人使用的是学校网站的linux平台(Linux ADVX.Mandrakesoft.com 2.4.3-19mdk ))& H/ B) Q1 x9 e* o; u* ^- c) k
1:调节服务器参数
. J% h5 o* l1 q用shell>MySQL(和PHP搭配之最佳组合)d-help这个命令声厂一张所有MySQL(和PHP搭配之最佳组合)选项和可配置变量的表.输出以下信息:
& y* J* M; N+ R- }6 ~; w% Cpossible variables for option--set-variable(-o) are:
; m6 t; q3 g% V6 K* @9 B& |* i6 |back_log current value:5 //要求MySQL(和PHP搭配之最佳组合)能有的连接数量.back_log指出在MySQL(和PHP搭配之最佳组合)暂停接受连接的时间内有多少个连接请求可以被存在堆栈中% h* ?% D* `: I1 a+ M
connect_timeout current value:5 //MySQL(和PHP搭配之最佳组合)服务器在用bad handshake(不好翻译)应答前等待一个连接的时间  }# X' Y% c' _# \
delayed_insert_timeout current value:200 //一个insert delayed在终止前等待insert的时间; v( w: A* l# y5 B4 G
delayed_insert_limit current value:50 //insert delayed处理器将检查是否有任何select语句未执行,如果有,继续前执行这些语句5 f9 B4 o' y2 f( I
delayed_queue_size current value:1000 //为insert delayed分配多大的队
/ E4 J, J/ K' F2 p4 ]4 s! Nflush_time current value:0 //如果被设置为非0,那么每个flush_time 时间,所有表都被关闭
* L2 o. I" G( I6 zinteractive_timeout current value:28800 //服务器在关上它之前在洋交互连接上等待的时间% ]+ W9 @( `6 x
join_buffer_size current value:131072 //用与全部连接的缓冲区大小0 C& H6 h# e6 q; G
key_buffer_size current value:1048540 //用语索引块的缓冲区的大小,增加它可以更好的处理索引! U7 j$ Q6 z$ A5 |9 M9 e- y
lower_case_table_names current value:0 //, \& h3 {: B- b( U- S3 q& P
long_query_time current value:10 //如果一个查询所用时间大于此时间,slow_queried计数将增加
/ U: t% ^: S5 i6 J+ emax_allowed_packet current value:1048576 //一个包的大小
) Z4 k+ o4 K+ `, _' T; W+ ~max_connections current value:300 //允许同时连接的数量& W6 o2 q* e7 J# k' F* O$ U4 b
max_connect_errors current value:10 //如果有多于该数量的中断连接,将阻止进一步的连接,可以用flush hosts来解决* D* c* t3 F2 ?: Q6 J2 |& d
max_delayed_threads current value:15 //可以启动的处理insert delayed的数量0 ]) q8 \* p% `' M3 }# V. e
max_heap_table_size current value:16777216 //
. L$ |2 M+ N1 O3 H  h+ g' O0 nmax_join_size current value:4294967295 //允许读取的连接的数量( A3 K1 J( y# d' T/ C% j) P  v3 x; e
max_sort_length current value:1024 //在排序blob或者text时使用的字节数量
6 x- V. P+ f" d3 }max_tmp_tables current value:32 //一个连接同时打开的临时表的数量
) J0 {9 c: D5 Jmax_write_lock_count current value:4294967295 //指定一个值(通常很小)来启动MySQL(和PHP搭配之最佳组合)d,使得在一定数量的write锁定之后出现read锁定6 h% I! ~2 h/ Y, R
net_buffer_length current value:16384 //通信缓冲区的大小--在查询时被重置为该大小# H, W3 Q1 |7 E; z% h5 e
query_buffer_size current value:0 //查询时缓冲区大小
/ q( \) K+ B7 K# o. m0 qrecord_buffer current value:131072 //每个顺序扫描的连接为其扫描的每张表分配的缓冲区的大小
* H6 @' ~1 g  G! |% asort_buffer current value:2097116 //每个进行排序的连接分配的缓冲区的大小9 u1 \- z- t% ]; n* ^+ ~( o# b
table_cache current value:64 //为所有连接打开的表的数量
' \8 C6 S1 Z, ~) pthread_concurrency current value:10 //4 u2 A0 a% ?' p
tmp_table_size current value:1048576 //临时表的大小0 I0 W- t+ i; y) l9 M
thread_stack current value:131072 //每个线程的大小& b( V& Y: N- i6 H) r: q
wait_timeout current value:28800 //服务器在关闭它3之前的一个连接上等待的时间
) Q* v& V4 A; [: Q* a% b( V根据自己的需要配置以上信息会对你帮助.
  o& W4 b; g! u! ]6 s0 nMySQL数据库优化--SQL第三:
7 G; m" m. k" G5 v1:如果你在一个数据库中创建大量的表,那么执行打开,关闭,创建(表)的操作就会很慢. 2:MySQL(和PHP搭配之最佳组合)使用内存$ q- B) \+ ?' `) l+ K: n% \4 x
a: 关键字缓存区(key_buffer_size)由所有线程共享! R) O* J# T1 K8 T
b: 每个连接使用一些特定的线程空间.一个栈(默认为64k,变量thread_stack),一个连接缓冲区(变量net_buffer_length)和一个结果缓冲区(net_buffer_length).特定情况下,连接缓冲区和结果缓冲区被动态扩大到max_allowed_packet.
, f0 |7 y: w# \; C0 C8 Ac:所有线程共享一个基存储器) m6 |! X- q7 H, Y% r; }- V/ q
d:没有内存影射
- r' ]. ?( y3 W& z! _/ Q& ]e:每个做顺序扫描的请求分配一个读缓冲区(record_buffer)" }8 m; m2 X# h# V! ?* w5 @
f:所有联结均有一遍完成并且大多数联结甚至可以不用一个临时表完成.最临时的表是基于内存的(heap)表% I: x% S  o7 s  L2 P) Y* e$ s& c' A
g:排序请求分配一个排序缓冲区和2个临时表/ n( M( m! P5 `+ _
h:所有语法分析和计算都在一个本地存储器完成
2 q9 U: C4 O% V" k, {. b) I7 ei:每个索引文件只被打开一次,并且数据文件为每个并发运行的线程打开一次+ F+ P6 [' D: [# b' Y
j:对每个blob列的表,一个缓冲区动态的被扩大以便读入blob值
  N1 f3 j( Y% O  C' d2 K: {2 Dk:所有正在使用的表的表处理器被保存在一个缓冲器中并且作为一个fifo管理.
# T% v" Y; O, r8 N: T% V" `l:一个MySQL(和PHP搭配之最佳组合)admin flush-tables命令关闭所有不在使用的表并且在当前执行的线程结束时标记所有在使用的表准备关闭
7 T+ @/ f5 c5 ?; ?3:MySQL(和PHP搭配之最佳组合)锁定表) k$ ]% E; J" X9 |* R' Z
MySQL(和PHP搭配之最佳组合)中所有锁定不会成为死锁. wirte锁定: MySQL(和PHP搭配之最佳组合)的锁定原理:a:如果表没有锁定,那么锁定;b否则,把锁定请求放入写锁定队列中3 Q% Z1 Z3 w! m, @. ^+ a
read锁定: MySQL(和PHP搭配之最佳组合)的锁定原理:a:如果表没有锁定,那么锁定;b否则,把锁定请求放入读锁定队列中3 \' b/ c' u! h+ O7 _
有时候会在一个表中进行很多的select,insert操作,可以在一个临时表中插入行并且偶尔用临时表的记录更新真正的表
% ?' s4 F3 d+ {max_tmp_tables current value:32 //一个连接同时打开的临时表的数量
2 J' E+ A0 z6 z  b* O  dmax_write_lock_count current value:4294967295 //指定一个值(通常很小)来启动MySQL(和PHP搭配之最佳组合)d,使得在一定数量的write锁定之后出现read锁定
  {; B( S& }- B1 C& ^4 wnet_buffer_length current value:16384 //通信缓冲区的大小--在查询时被重置为该大小5 w  j8 i2 H6 g' X- Z% B
query_buffer_size current value:0 //查询时缓冲区大小" M1 r+ x; I: l5 L* T' }
record_buffer current value:131072 //每个顺序扫描的连接为其扫描的每张表分配的缓冲区的大小: @( y. d/ _  K* y
sort_buffer current value:2097116 //每个进行排序的连接分配的缓冲区的大小
9 F- r; z& \1 V1 n0 b3 n& G) }  x/ Htable_cache current value:64 //为所有连接打开的表的数量+ |1 }0 c- X) r8 }6 P" _: y- p
thread_concurrency current value:10 //
. L4 N! z$ s! `' s& U% K1 Ktmp_table_size current value:1048576 //临时表的大小$ [$ B& g+ R* u: \% k
thread_stack current value:131072 //每个线程的大小6 n" }8 ?) O7 Z% X
wait_timeout current value:28800 //服务器在关闭它3之前的一个连接上等待的时间8 l7 g0 ?9 m, w% M4 p8 ~' k: E4 r% p
根据自己的需要配置以上信息会对你帮助.
8 T+ y: d2 U8 J

回复|共 23 个

pangio Lv.8 发表于 2014-10-2 11:36:08|美国 | 查看全部
到你的~~贴吧收藏~~~我的发言~`找
inhidgehila Lv.8 发表于 2014-10-2 11:52:30|美国 | 查看全部
这个程序有没有漏洞啊
kjlqiyjws Lv.8 发表于 2014-10-2 11:59:15|泰国 | 查看全部
嘿...反了反了,,,,
jckie Lv.8 发表于 2014-10-9 08:57:06|捷克 | 查看全部
我不知道他说的是什么啊~~
kwjvtwzx Lv.15 发表于 2014-10-9 09:19:16|美国 | 查看全部
baidu是相当能折腾我了
kbcesuo Lv.8 发表于 2014-10-9 09:21:09|加拿大 | 查看全部
好吧...那你说...
ffuip Lv.8 发表于 2014-10-9 09:43:21|韩国 | 查看全部
本人在此留言均为网络上复制,用于检验本人电脑键盘录入、屏幕显示的机械、光电性能。并不代表本人局部或全部同意、支持或者反对楼主观点。
kwjvtwzx Lv.15 发表于 2014-10-9 09:47:39|美国 | 查看全部
还没崇拜过谁呢,满足一下愿望吧,谢谢!
jckie Lv.8 发表于 2014-10-10 20:40:23|美国 | 查看全部
笨点也好~~~~
kjlqiyjws Lv.8 发表于 2014-10-10 20:54:47|美国 | 查看全部
什么?????不知道......
inhidgehila Lv.8 发表于 2014-10-10 21:04:30|意大利 | 查看全部
经过你的指点 我还是没找到在哪 ~~~
inhidgehila Lv.8 发表于 2014-10-10 21:12:00|美国 | 查看全部
我想骂我自己
apgckwmm Lv.8 发表于 2014-10-10 21:16:40|美国 | 查看全部
真心顶,感觉说的太好了!
jckie Lv.8 发表于 2014-10-18 22:20:10|西班牙 | 查看全部
去干吗啊~~~伤心啊~~~

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

得知互动是一个融创意、设计、开发、营销、生活、互联网于一体的专业交流分享平台。
Copyright © 2026 站长技术交流论坛|互联网技术交流平台|Ai技术交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表