程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> MySQL數據庫優化五步走

MySQL數據庫優化五步走

編輯:MYSQL入門知識
 

MySQL數據庫是一種小型關系型數據庫管理系統,MySQL數據庫的優化是MySQL數據庫操作過程中非常重要的工作,MySQL數據庫的優化能夠實現MySQL數據庫操作的簡便。

第一步:

1:磁盤尋道能力,以高速硬盤(7200轉/秒),理論上每秒尋道7200次.這是沒有辦法改變的,優化的方法是----用多個硬盤,或者把數據分散存儲.

2:硬盤的讀寫速度,這個速度非常的快,這個更容易解決--可以從多個硬盤上並行讀寫.

3:cpu.cpu處理內存中的數據,當有相對內存較小的表時,這是最常見的限制因素.

4:內存的限制.當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時使用的字節數量

max_tmp_tables current value:32 //一個連接同時打開的臨時表的數量

max_write_lock_count current value:4294967295 //指定一個值(通常很小)來啟動mysqld,使得在一定數量的write鎖定之後出現read鎖定

net_buffer_length current value:16384 //通信緩沖區的大小--在查詢時被重置為該大小

query_buffer_size current value:0 //查詢時緩沖區大小

record_buffer current value:131072 //每個順序掃描的連接為其掃描的每張表分配的緩沖區的大小

sort_buffer current value:2097116 //每個進行排序的連接分配的緩沖區的大小

table_cache current value:64 //為所有連接打開的表的數量

thread_concurrency current value:10 //

tmp_table_size current value:1048576 //臨時表的大小

thread_stack current value:131072 //每個線程的大小

wait_timeout current value:28800 //服務器在關閉它3之前的一個連接上等待的時間

根據自己的需要配置以上信息會對你幫助.

第三步:

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  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved