優化MySQL數據庫查詢
最簡單且最安全的格式,它是磁盤格式中最快的.速度來自於數據能在磁盤上被找到的難易程度.當鎖定有一個索引和靜態格式的東西是,它很簡單,只是行長度乘以數量.而且在掃描一張表時,每次用磁盤讀取來讀入常數個記錄是很容易的.安全性來源於如果當寫入一個靜態myisam文件時導致計算機down掉,myisamchk很容易指出每行在哪裡開始和結束,因此,它通常能收回所有記錄,除了部分被寫入的記錄.在mysql中所有索引總能被重建
1.2動態myisam
這種格式每一行必須有一個頭說明它有多長.當一個記錄在更改期間變長時,它可以在多於一個位置上結束.能使用optimize tablename或myisamchk整理一張表.如果在同一個表中有像某些varchar或者blob列那樣存取/改變的靜態數據,將動態列移入另外一個表以避免碎片.
1.2.1壓縮myisam,用可選的myisampack工具生成
1.2.2內存
這種格式對小型/中型表很有用.對拷貝/創建一個常用的查找表到洋heap表有可能加快多個表聯結,用同樣數據可能要快好幾倍時間.
select tablename.a,tablename2.a from tablename,tablanem2,tablename3 where
tablaneme.a=tablename2.a and tablename2.a=tablename3.a and tablename2.c!=0;
為了加速它,可以用tablename2和tablename3的聯結創建一個臨時表,因為用相同列(tablename1.a)查找.
CREATE TEMPORARY TABLE test TYPE=HEAP
SELECT
tablename2.a as a2,tablename3.a as a3
FROM
tablenam2,tablename3
WHERE
tablename2.a=tablename3.a and c=0;
SELECT tablename.a,test.a3 from tablename,test where tablename.a=test.a1;
SELECT tablename.a,test,a3,from tablename,test where tablename.a=test.a1 and ....;
1.3靜態表的特點
1.3.1默認格式.用在表不包含varchar,blob,text列的時候
1.3.2所有的char,numeric和decimal列填充到列寬度
1.3.3非常快
1.3.4容易緩沖
1.3.5容易在down後重建,因為記錄位於固定的位置
1.3.6不必被重新組織(用myisamchk),除非是一個巨量的記錄被刪除並且優化存儲大小
1.3.7通常比動態表需要更多的存儲空間
1.4動態表的特點
1.4.1如果表包含任何varchar,blob,text列,使用該格式
1.4.2所有字符串列是動態的
1.4.3每個記錄前置一個位.
1.4.4通常比定長表需要更多的磁盤空間
1.4.5每個記錄僅僅使用所需要的空間,如果一個記錄變的很大,它按需要被分成很多段,這導致了記錄碎片
1.4.6如果用超過行長度的信息更新行,行被分段.
1.4.7在系統down掉以後不好重建表,因為一個記錄可以是多段
1.4.8對動態尺寸記錄的期望行長度是3+(number of columns+7)/8+(number of char columns)+packed size of numeric columns+length of strings +(number of NULL columns+7)/8
對每個連接有6個字節的懲罰.無論何時更改引起記錄的變大,都有一個動態記錄被連接.每個新連接至少有20個字節,因此下一個變大將可能在同一個連接中.如果不是,將有另外一個連接.可以用myisamchk -惡毒檢查有多少連接.所有連接可以用myisamchk -r刪除.
1.5壓縮表的特點
1.5.1一張用myisampack實用程序制作的只讀表.
1.5.2解壓縮代碼存在於所有mysql分發中,以便使沒有myisampack的連接也能讀取用myisampack壓縮的表
1.5.3占據很小的磁盤空間
1.5.4每個記錄被單獨壓縮.一個記錄的頭是一個定長的(1~~3個字節)這取決於表的最大記錄.每列以不同的方式被壓縮.一些常用的壓縮類型是:
a:通常對每列有一張不同的哈夫曼表 b:後綴空白壓縮 c:前綴空白壓縮 d:用值0的數字使用1位存儲
e:如果整數列的值有一個小范圍,列使用最小的可能類型來存儲.例如:如果所有的值在0到255之間,一個bigint可以作為一個tinyint存儲
g:如果列僅有可能值的一個小集合,列類型被轉換到enum h:列可以使用上面的壓縮方法的組合
1.5.5能處理定長或動態長度的記錄,去不能處理blob或者text列 1.5.6能用myisamchk解壓縮
mysql能支持不同的索引類型,但一般的類型是isam,這是一個B樹索引並且能粗略的為索引文件計算大小為(key_length+4)*0.67,在所有的鍵上的總和.
字符串索引是空白壓縮的。如果第一個索引是一個字符串,它可將壓縮前綴如果字符串列有很多尾部空白或是一個總部能甬道全長的varchar列,空白壓縮使索引文件更小.如果很多字符串有相同的前綴.
1.6內存表的特點
mysql內部的heap表使用每偶溢出去的100%動態哈希並且沒有與刪除有關的問題.只能通過使用在堆表中的一個索引來用等式存取東西(通常用'='操作符)
堆表的缺點是:
1.6.1想要同時使用的所有堆表需要足夠的額外內存
1.6.2不能在索引的一個部分搜索
1.6.3不能按順序搜索下一個條目(即,使用這個索引做一個order by)
:內存的限制.當cpu需要超出適合cpu緩存的數據時,緩存的帶寬就成了內存的一個瓶頸---不過現在內存大的驚人,一般不會出現這個問題.
第二步: (本人使用的是學校網站的linux平台(Linux ADVX.Mandrakesoft.com 2.4.3-19mdk ))
1:調節服務器參數
用shell>mysqld-help這個命令聲廠一張所有mysql選項和可配置變量的表.輸出以下信息:
possible variables for option--set-variable(-o) are:
back_log current value:5 //要求mysql能有的連接數量.back_log指出在mysql暫停接受連接的時間內有多少個連接請求可以被存在堆棧中
connect_timeout current value:5 //mysql服務器在用bad handshake(不好翻譯)應答前等待一個連接的時間
delayed_insert_timeout current value:200 //一個insert delayed在終止前等待insert的時間
delayed_insert_limit current value:50 //insert delayed處理器將檢查是否有任何select語句未執行,如果有,繼續前執行這些語句
delayed_queue_size current value:1000 //為insert delayed分配多大的隊
flush_time current value:0 //如果被設置為非0,那麼每個flush_time 時間,所有表都被關閉
interactive_timeout current value:28800 //服務器在關上它之前在洋交互連接上等待的時間
join_buffer_size current value:131072 //用與全部連接的緩沖區大小
key_buffer_size current value:1048540 //用語索引塊的緩沖區的大小,增加它可以更好的處理索引
lower_case_table_names current value:0 //
long_query_time current value:10 //如果一個查詢所用時間大於此時間,slow_queried計數將增加
max_allowed_packet current value:1048576 //一個包的大小
max_connections current value:300 //允許同時連接的數量
max_connect_errors current value:10 //如果有多於該數量的中斷連接,將阻止進一步的連接,可以用flush hosts來解決
max_delayed_threads current value:15 //可以啟動的處理insert delayed的數量
max_heap_table_size current value:16777216 //
max_join_size current value:4294967295 //允許讀取的連接的數量
max_sort_length current value:1024 //在排序blob或者text時