MYSQL數(shù)據(jù)庫優(yōu)化的具體方法說明
技術(shù)支持服務(wù)電話:15308000360 【7x24提供運(yùn)維服務(wù),解決各類系統(tǒng)/軟硬件疑難技術(shù)問題】
以下的文章主要講述的是實(shí)現(xiàn)MySQL簡單實(shí)用優(yōu)化的具體方法,以及在實(shí)際操作中有哪些具體操作步驟是值得我們大家注意的。以下的文章主要描述的是MySQL數(shù)據(jù)庫簡單實(shí)用優(yōu)化的具體方法的實(shí)現(xiàn),中包括如何定期的表進(jìn)行分析與檢查,以及如何正確對(duì)表進(jìn)行定期的優(yōu)化,以下就是具體方案的描述,希望在你今后的學(xué)習(xí)中會(huì)有所幫助。
1、定期分析表和檢查表 分析表的語法如下:
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name[, tbl_name]...
以上語句用于分析和存儲(chǔ)表的關(guān)鍵字分布,分析的結(jié)果將可以使得系統(tǒng)得到準(zhǔn)確的統(tǒng)計(jì)信息,使得SQL能夠生成正確的執(zhí)行計(jì)劃。如果用戶感覺實(shí)際執(zhí)行計(jì)劃并不是預(yù)期的執(zhí)行計(jì)劃,執(zhí)行一次分析表可能會(huì)解決問題。在分析期間,使用一個(gè)讀取鎖定對(duì)表進(jìn)行鎖定。這對(duì)于MyISAM,DBD和InnoDB表有作用。例如分析一個(gè)數(shù)據(jù)表
analyze table table_name 檢查表的語法如下: CHECK TABLE tb1_name[,tbl_name]...[option]...option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED} 檢查表的作用是檢查一個(gè)或多個(gè)表是否有錯(cuò)誤,CHECK TABLE 對(duì)MyISAM 和 InnoDB表有作用,對(duì)于MyISAM表,關(guān)鍵字統(tǒng)計(jì)數(shù)據(jù)被更新 CHECK TABLE 也可以檢查視圖是否有錯(cuò)誤,比如在視圖定義中被引用的表不存在。
2. 定期優(yōu)化表 優(yōu)化表的語法如下:
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name [,tbl_name]... 如果刪除了表的一大部分,或者如果已經(jīng)對(duì)含有可變長度行的表(含有 VARCHAR、BLOB或TEXT列的表)進(jìn)行更多更改,則應(yīng)使用OPTIMIZE TABLE命令來進(jìn)行表優(yōu)化。這個(gè)命令可以將表中的空間碎片進(jìn)行合并,并且可以消除由于刪除或者更新造成的空間浪費(fèi),但OPTIMIZE TABLE 命令只對(duì)MyISAM、 BDB 和InnoDB表起作用。 例如: optimize table table_name
注意: analyze、check、optimize執(zhí)行期間將對(duì)表進(jìn)行鎖定,因此一定注意要在MySQL數(shù)據(jù)庫不繁忙的時(shí)候執(zhí)行相關(guān)的操作。常用的SQL優(yōu)化 我們在開發(fā)的時(shí)候常常用到的SQL語句,無非是INSERT、GROUPBY等等。對(duì)于這些SQL語句,我們怎么進(jìn)行優(yōu)化? 1. 大批量插入數(shù)據(jù) 當(dāng)用load命令導(dǎo)入數(shù)據(jù)的時(shí)候,適當(dāng)?shù)脑O(shè)置可以提高導(dǎo)入的速度。
對(duì)于MyISAM存儲(chǔ)引擎的表,可以通過如下方式快速的導(dǎo)入大量的數(shù)據(jù) ALTER TABLE tb1_name DISABLE KEYS;
loading the data
ALTER TABLE tb1_name ENABLE KEYS;
DISABLE KEYS 和 ENABLE KEYS 用來打開或者關(guān)閉MyISAM表非唯一索引的更新。在導(dǎo)入大量的數(shù)據(jù)到一個(gè)非空的MyISAM表時(shí),通過設(shè)置這兩個(gè)命令,可以提高導(dǎo)入的效率。
對(duì)于導(dǎo)入大量的數(shù)據(jù)到一個(gè)空的MyISAM表時(shí),默認(rèn)就是先導(dǎo)入數(shù)據(jù)然后才創(chuàng)建索引的,索引不用進(jìn)行設(shè)置。
load data infile '/home/mysql/text_txt' into table text 對(duì)于InnoDB類型的表,這種方式不能提高導(dǎo)入數(shù)據(jù)的效率,但也有幾種針對(duì)InnoDB類型的表進(jìn)行優(yōu)化的方式。 1. 因?yàn)镮nnoDB類型的表式按照主鍵的順序保存的,所以將導(dǎo)入的數(shù)據(jù)按照主鍵的順序排序,可以有效提高導(dǎo)入數(shù)據(jù)的效率。 2. 在導(dǎo)入數(shù)據(jù)前執(zhí)行 SET UNIQUE_CHECKS=0,關(guān)閉唯一性校驗(yàn),在導(dǎo)入結(jié)束后執(zhí)行SET UNIQUE_CHECKS=1,恢復(fù)唯一性校驗(yàn),可以提高導(dǎo)入的效率。 3. 如果應(yīng)用使用自動(dòng)提交的方式,建議在導(dǎo)入前執(zhí)行SET AUTOCOMMIT=0,關(guān)閉自動(dòng)提交,導(dǎo)入結(jié)束后執(zhí)行SET AUTOCOMMIT=1,打開自動(dòng)提交,也可以提高導(dǎo)入效率。優(yōu)化INSERT語句
當(dāng)進(jìn)行數(shù)據(jù)INSERT的時(shí)候,可以考慮采用以下幾種方式進(jìn)行優(yōu)化 1. 如果同時(shí)從一個(gè)客戶插入很多行,盡量使用多個(gè)值表的INSERT語句,這種方式將大大縮短客戶端與MySQL數(shù)據(jù)庫的鏈接、關(guān)閉等消耗,使得效率比分開執(zhí)行的單個(gè)INSERT語句快. 例如:
insert into test values(1,2)
insert into test values(3,4)
insert into test values(5,6)
將上面三句改為:insert into test values(1,2),(3,4),(5,6)...... 2. 如果從不同客戶插入很多行,能通過使用INSERT DELAYED 語句得到更高的速度。 DELAYED 的含義是讓INSERT 語句馬上執(zhí)行,其實(shí)數(shù)據(jù)都被放在內(nèi)存的隊(duì)列中,并沒有真正寫入磁盤,這比每條語句分別插入要快得多;LOW_PRIORITY剛好相反,在所有其他用戶對(duì)表的讀寫完后才進(jìn)行插入。 3. 將索引文件和數(shù)據(jù)文件分在不同的磁盤上存放 4. 如果進(jìn)行批量插入,可以增加bulk_insert_buffer_size變量值的方法來提高速度,但是,這只能對(duì)于MyISAM表使用。 5. 當(dāng)從一個(gè)文本文件中裝載一個(gè)表時(shí),使用LOAD DATA INFILE。 這通常比使用很多insert語句快20倍左右。下面是mysql 性能優(yōu)化的一些其它需要注意的地方,大家結(jié)合和,充分發(fā)揮mysql的性能。
以下的文章主要向大家描述的是MySQL數(shù)據(jù)庫優(yōu)化,SQL的實(shí)際操作步驟,我們講述的是MySQL數(shù)據(jù)庫優(yōu)化,SQL的三步驟,以下就是這三步驟的具體操作的詳細(xì)描述,望你瀏覽之后會(huì)對(duì)其有所收獲。
MySQL數(shù)據(jù)庫優(yōu)化--SQL第一步:
1:磁盤尋道能力,以高速硬盤(7200轉(zhuǎn)/秒),理論上每秒尋道7200次.這是沒有辦法改變的,優(yōu)化的方法是----用多個(gè)硬盤,或者把數(shù)據(jù)分散存儲(chǔ).
2:硬盤的讀寫速度,這個(gè)速度非常的快,這個(gè)更容易解決--可以從多個(gè)硬盤上并行讀寫.
3:cpu.cpu處理內(nèi)存中的數(shù)據(jù),當(dāng)有相對(duì)內(nèi)存較小的表時(shí),這是最常見的限制因素.
4:內(nèi)存的限制.當(dāng)cpu需要超出適合cpu緩存的數(shù)據(jù)時(shí),緩存的帶寬就成了內(nèi)存的一個(gè)瓶頸---不過現(xiàn)在內(nèi)存大的驚人,一般不會(huì)出現(xiàn)這個(gè)問題.
MySQL數(shù)據(jù)庫優(yōu)化--SQL第二步: (本人使用的是學(xué)校網(wǎng)站的linux平臺(tái)(Linux ADVX.Mandrakesoft.com 2.4.3-19mdk ))
1:調(diào)節(jié)服務(wù)器參數(shù)
用shell>MySQL(和PHP搭配之最佳組合)d-help這個(gè)命令聲廠一張所有MySQL(和PHP搭配之最佳組合)選項(xiàng)和可配置變量的表.輸出以下信息:
possible variables for option--set-variable(-o) are:
back_log current value:5 //要求MySQL(和PHP搭配之最佳組合)能有的連接數(shù)量.back_log指出在MySQL(和PHP搭配之最佳組合)暫停接受連接的時(shí)間內(nèi)有多少個(gè)連接請(qǐng)求可以被存在堆棧中
connect_timeout current value:5 //MySQL(和PHP搭配之最佳組合)服務(wù)器在用bad handshake(不好翻譯)應(yīng)答前等待一個(gè)連接的時(shí)間
delayed_insert_timeout current value:200 //一個(gè)insert delayed在終止前等待insert的時(shí)間
delayed_insert_limit current value:50 //insert delayed處理器將檢查是否有任何select語句未執(zhí)行,如果有,繼續(xù)前執(zhí)行這些語句
delayed_queue_size current value:1000 //為insert delayed分配多大的隊(duì)
flush_time current value:0 //如果被設(shè)置為非0,那么每個(gè)flush_time 時(shí)間,所有表都被關(guān)閉
interactive_timeout current value:28800 //服務(wù)器在關(guān)上它之前在洋交互連接上等待的時(shí)間
join_buffer_size current value:131072 //用與全部連接的緩沖區(qū)大小
key_buffer_size current value:1048540 //用語索引塊的緩沖區(qū)的大小,增加它可以更好的處理索引
lower_case_table_names current value:0 //
long_query_time current value:10 //如果一個(gè)查詢所用時(shí)間大于此時(shí)間,slow_queried計(jì)數(shù)將增加
max_allowed_packet current value:1048576 //一個(gè)包的大小
max_connections current value:300 //允許同時(shí)連接的數(shù)量
max_connect_errors current value:10 //如果有多于該數(shù)量的中斷連接,將阻止進(jìn)一步的連接,可以用flush hosts來解決
max_delayed_threads current value:15 //可以啟動(dòng)的處理insert delayed的數(shù)量
max_heap_table_size current value:16777216 //
max_join_size current value:4294967295 //允許讀取的連接的數(shù)量
max_sort_length current value:1024 //在排序blob或者text時(shí)使用的字節(jié)數(shù)量
max_tmp_tables current value:32 //一個(gè)連接同時(shí)打開的臨時(shí)表的數(shù)量
max_write_lock_count current value:4294967295 //指定一個(gè)值(通常很小)來啟動(dòng)MySQL(和PHP搭配之最佳組合)d,使得在一定數(shù)量的write鎖定之后出現(xiàn)read鎖定
net_buffer_length current value:16384 //通信緩沖區(qū)的大小--在查詢時(shí)被重置為該大小
query_buffer_size current value:0 //查詢時(shí)緩沖區(qū)大小
record_buffer current value:131072 //每個(gè)順序掃描的連接為其掃描的每張表分配的緩沖區(qū)的大小
sort_buffer current value:2097116 //每個(gè)進(jìn)行排序的連接分配的緩沖區(qū)的大小
table_cache current value:64 //為所有連接打開的表的數(shù)量
thread_concurrency current value:10 //
tmp_table_size current value:1048576 //臨時(shí)表的大小
thread_stack current value:131072 //每個(gè)線程的大小
wait_timeout current value:28800 //服務(wù)器在關(guān)閉它3之前的一個(gè)連接上等待的時(shí)間
根據(jù)自己的需要配置以上信息會(huì)對(duì)你幫助.
MySQL數(shù)據(jù)庫優(yōu)化--SQL第三:
1:如果你在一個(gè)數(shù)據(jù)庫中創(chuàng)建大量的表,那么執(zhí)行打開,關(guān)閉,創(chuàng)建(表)的操作就會(huì)很慢. 2:MySQL(和PHP搭配之最佳組合)使用內(nèi)存
a: 關(guān)鍵字緩存區(qū)(key_buffer_size)由所有線程共享
b: 每個(gè)連接使用一些特定的線程空間.一個(gè)棧(默認(rèn)為64k,變量thread_stack),一個(gè)連接緩沖區(qū)(變量net_buffer_length)和一個(gè)結(jié)果緩沖區(qū)(net_buffer_length).特定情況下,連接緩沖區(qū)和結(jié)果緩沖區(qū)被動(dòng)態(tài)擴(kuò)大到max_allowed_packet.
c:所有線程共享一個(gè)基存儲(chǔ)器
d:沒有內(nèi)存影射
e:每個(gè)做順序掃描的請(qǐng)求分配一個(gè)讀緩沖區(qū)(record_buffer)
f:所有聯(lián)結(jié)均有一遍完成并且大多數(shù)聯(lián)結(jié)甚至可以不用一個(gè)臨時(shí)表完成.最臨時(shí)的表是基于內(nèi)存的(heap)表
g:排序請(qǐng)求分配一個(gè)排序緩沖區(qū)和2個(gè)臨時(shí)表
h:所有語法分析和計(jì)算都在一個(gè)本地存儲(chǔ)器完成
i:每個(gè)索引文件只被打開一次,并且數(shù)據(jù)文件為每個(gè)并發(fā)運(yùn)行的線程打開一次
j:對(duì)每個(gè)blob列的表,一個(gè)緩沖區(qū)動(dòng)態(tài)的被擴(kuò)大以便讀入blob值
k:所有正在使用的表的表處理器被保存在一個(gè)緩沖器中并且作為一個(gè)fifo管理.
l:一個(gè)MySQL(和PHP搭配之最佳組合)admin flush-tables命令關(guān)閉所有不在使用的表并且在當(dāng)前執(zhí)行的線程結(jié)束時(shí)標(biāo)記所有在使用的表準(zhǔn)備關(guān)閉
3:MySQL(和PHP搭配之最佳組合)鎖定表
MySQL(和PHP搭配之最佳組合)中所有鎖定不會(huì)成為死鎖. wirte鎖定: MySQL(和PHP搭配之最佳組合)的鎖定原理:a:如果表沒有鎖定,那么鎖定;b否則,把鎖定請(qǐng)求放入寫鎖定隊(duì)列中
read鎖定: MySQL(和PHP搭配之最佳組合)的鎖定原理:a:如果表沒有鎖定,那么鎖定;b否則,把鎖定請(qǐng)求放入讀鎖定隊(duì)列中
有時(shí)候會(huì)在一個(gè)表中進(jìn)行很多的select,insert操作,可以在一個(gè)臨時(shí)表中插入行并且偶爾用臨時(shí)表的記錄更新真正的表
max_tmp_tables current value:32 //一個(gè)連接同時(shí)打開的臨時(shí)表的數(shù)量
max_write_lock_count current value:4294967295 //指定一個(gè)值(通常很小)來啟動(dòng)MySQL(和PHP搭配之最佳組合)d,使得在一定數(shù)量的write鎖定之后出現(xiàn)read鎖定
net_buffer_length current value:16384 //通信緩沖區(qū)的大小--在查詢時(shí)被重置為該大小
query_buffer_size current value:0 //查詢時(shí)緩沖區(qū)大小
record_buffer current value:131072 //每個(gè)順序掃描的連接為其掃描的每張表分配的緩沖區(qū)的大小
sort_buffer current value:2097116 //每個(gè)進(jìn)行排序的連接分配的緩沖區(qū)的大小
table_cache current value:64 //為所有連接打開的表的數(shù)量
thread_concurrency current value:10 //
tmp_table_size current value:1048576 //臨時(shí)表的大小
thread_stack current value:131072 //每個(gè)線程的大小
wait_timeout current value:28800 //服務(wù)器在關(guān)閉它3之前的一個(gè)連接上等待的時(shí)間
根據(jù)自己的需要配置以上信息會(huì)對(duì)你幫助。