當前位置:首頁 » 文件管理 » sqlmyisam緩存池

sqlmyisam緩存池

發布時間: 2023-03-18 05:32:19

『壹』 mariadb 如何實現伺服器內存使用最大化

查詢最高內存佔用

使用以下命令可以知道mysql的配置使用多少 RAM

SELECT ( @@key_buffer_size
+ @@query_cache_size
+ @@innodb_buffer_pool_size
+ @@innodb_additional_mem_pool_size
+ @@innodb_log_buffer_size
+ @@max_connections * ( @@read_buffer_size
+ @@read_rnd_buffer_size
+ @@sort_buffer_size
+ @@join_buffer_size
+ @@binlog_cache_size
+ @@thread_stack
+ @@tmp_table_size
)
) / (1024 * 1024 * 1024) AS MAX_MEMORY_GB;

可以使用mysql計算器來計算內存使用

下面是理論,可以直接到推薦配置

如何調整配置

key_buffer_size(MyISAM索引用)

指定索引緩沖區的大小,它決定索引處理的速度,尤其是索引讀的速度。為了逗帶最小化磁碟的 I/O , MyISAM 存儲引擎的表使用鍵高速緩存來緩存索引,這個鍵高速緩存的大小則通過 key-buffer-size 參數來設置。如果應用系統中使用指侍的表以 MyISAM 存儲引擎為主,則應該適當增加該參數的值,以便盡可能的緩存索引,提高訪問的速度。

怎麼設

show global status like 'key_read%';

+------------------------+-------------+
| Variable_name | Value |
+------------------------+-------------+
| Key_read_requests | 27813678764 |
| Key_reads | 6798830 |
---------------------

  • key_buffer_size通過檢查狀態值Key_read_requests和Key_reads,可以知道key_buffer_size設置是否合理。

  • 比例key_reads / key_read_requests應該盡可能的低,至少是1:100,1:1000更好。

  • show global status like '%created_tmp_disk_tables%';

  • key_buffer_size只對MyISAM表起作用。即使你不使用MyISAM表,但是內部的臨時磁碟表是MyISAM表,也要使用該值。可以使用檢查狀態值created_tmp_disk_tables得知詳情。

  • 對於1G內存的機器,如果不使用MyISAM表,推薦值是16M(8-64M)

  • 另一個參考如下

  • show global status like 'key_blocks_u%';

  • +------------------------+-------------+

  • | Variable_name | Value |

  • +------------------------+-------------+

  • | Key_blocks_unused | 0 |

  • | Key_blocks_used | 413543 |

  • +------------------------+-------------+

  • Key_blocks_unused表示未使用的緩存簇(blocks)數,Key_blocks_used表示曾經用到的最大的blocks數,比如這台伺服器,所有的緩存都用到了,要麼增加key_buffer_size,要麼就是過渡索引了,把緩存占滿了。比較理想的設置:

  • 可以根據此工式來動態的調整Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%

  • show engines;

  • 查詢存儲引擎

  • innodb_buffer_pool_size (innodb索引用)

    這個參數和MyISAM的key_buffer_size有相唯指吵似之處,但也是有差別的。這個參數主要緩存innodb表的索引,數據,插入數據時的緩沖。為Innodb加速優化首要參數。

    該參數分配內存的原則:這個參數默認分配只有8M,可以說是非常小的一個值。

  • 如果是專用的DB伺服器,且以InnoDB引擎為主的場景,通常可設置物理內存的50%,這個參數不能動態更改,所以分配需多考慮。分配過大,會使Swap佔用過多,致使Mysql的查詢特慢。

  • 如果是非專用DB伺服器,可以先嘗試設置成內存的1/4,如果有問題再調整

  • query_cache_size(查詢緩存)

    緩存機制簡單的說就是緩存sql文本及查詢結果,如果運行相同的sql,伺服器直接從緩存中取到結果,而不需要再去解析和執行sql。如果表更改了,那麼使用這個表的所有緩沖查詢將不再有效,查詢緩存值的相關條目被清空。更改指的是表中任何數據或是結構的改變,包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,也包括那些映射到改變了的表的使用MERGE表的查詢。顯然,這對於頻繁更新的表,查詢緩存是不適合的,而對於一些不常改變數據且有大量相同sql查詢的表,查詢緩存會節約很大的性能。

  • 注意:如果你查詢的表更新比較頻繁,而且很少有相同的查詢,最好不要使用查詢緩存。因為這樣會消耗很大的系統性能還沒有任何的效果

  • 要不要打開?

    先設置成這樣跑一段時間

  • query_cache_size=128M

  • query_cache_type=1

  • 看看命中結果來進行進一步的判斷

  • mysql> show status like '%Qcache%';

  • +-------------------------+-----------+

  • | Variable_name | Value |

  • +-------------------------+-----------+

  • | Qcache_free_blocks | 669 |

  • | Qcache_free_memory | 132519160 |

  • | Qcache_hits | 1158 |

  • | Qcache_inserts | 284824 |

  • | Qcache_lowmem_prunes | 2741 |

  • | Qcache_not_cached | 1755767 |

  • | Qcache_queries_in_cache | 579 |

  • | Qcache_total_blocks | 1853 |

  • +-------------------------+-----------+8 rows in set (0.00 sec)

  • Qcache_free_blocks:表示查詢緩存中目前還有多少剩餘的blocks,如果該值顯示較大,則說明查詢緩存中的內存碎片過多了,可能在一定的時間進行整理。

    Qcache_free_memory:查詢緩存的內存大小,通過這個參數可以很清晰的知道當前系統的查詢內存是否夠用,是多了,還是不夠用,DBA可以根據實際情況做出調整。

    Qcache_hits:表示有多少次命中緩存。我們主要可以通過該值來驗證我們的查詢緩存的效果。數字越大,緩存效果越理想。

    Qcache_inserts: 表示多少次未命中然後插入,意思是新來的SQL請求在緩存中未找到,不得不執行查詢處理,執行查詢處理後把結果insert到查詢緩存中。這樣的情況的次數,次數越多,表示查詢緩存應用到的比較少,效果也就不理想。當然系統剛啟動後,查詢緩存是空的,這很正常。

    Qcache_lowmem_prunes:該參數記錄有多少條查詢因為內存不足而被移除出查詢緩存。通過這個值,用戶可以適當的調整緩存大小。

    Qcache_not_cached: 表示因為query_cache_type的設置而沒有被緩存的查詢數量。

    Qcache_queries_in_cache:當前緩存中緩存的查詢數量。

    Qcache_total_blocks:當前緩存的block數量。

  • 我們可以看到現網命中1158,未緩存的有1755767次,說明我們這個系統命中的太少了,表變動比較多,不什麼開啟這個功能涉及參數

  • query_cache_limit:允許 Cache 的單條 Query 結果集的最大容量,默認是1MB,超過此參數設置的 Query 結果集將不會被 Cache

  • query_cache_min_res_unit:設置 Query Cache 中每次分配內存的最小空間大小,也就是每個 Query 的 Cache 最小佔用的內存空間大小

  • query_cache_size:設置 Query Cache 所使用的內存大小,默認值為0,大小必須是1024的整數倍,如果不是整數倍,MySQL 會自動調整降低最小量以達到1024的倍數

  • query_cache_type:控制 Query Cache 功能的開關,可以設置為0(OFF),1(ON)和2(DEMAND)三種,意義分別如下: 0(OFF):關閉 Query Cache 功能,任何情況下都不會使用 Query Cache 1(ON):開啟 Query Cache 功能,但是當 SELECT 語句中使用的 SQL_NO_CACHE 提示後,將不使用Query Cache 2(DEMAND):開啟 Query Cache 功能,但是只有當 SELECT 語句中使用了 SQL_CACHE 提示後,才使用 Query Cache

  • query_cache_wlock_invalidate:控制當有寫鎖定發生在表上的時刻是否先失效該表相關的 Query Cache,如果設置為 1(TRUE),則在寫鎖定的同時將失效該表相關的所有 Query Cache,如果設置為0(FALSE)則在鎖定時刻仍然允許讀取該表相關的 Query Cache。

  • innodb_additional_mem_pool_size(InnoDB內部目錄大小)

    InnoDB 字典信息緩存主要用來存放 InnoDB 存儲引擎的字典信息以及一些 internal 的共享數據結構信息,也就是存放Innodb的內部目錄,所以其大小也與系統中所使用的 InnoDB 存儲引擎表的數量有較大關系。

    這個值不用分配太大,通常設置16M夠用了,默認8M,如果設置的內存大小不夠,InnoDB 會自動申請更多的內存,並在 MySQL 的 Error Log 中記錄警告信息。

    innodb_log_buffer_size (日誌緩沖)

    表示InnoDB寫入到磁碟上的日誌文件時使用的緩沖區的位元組數,默認值為16M。一個大的日誌緩沖區允許大量的事務在提交之前不用寫日誌到磁碟,所以如果有更新,插入或刪除許多行的事務,則使日誌緩沖區更大一些可以節省磁碟IO

    通常最大設為64M足夠

    max_connections (最大並發連接)

    MySQL的max_connections參數用來設置最大連接(用戶)數。每個連接MySQL的用戶均算作一個連接,max_connections的默認值為100。

  • 這個參數實際起作用的最大值(實際最大可連接數)為16384,即該參數最大值不能超過16384,即使超過也以16384為准;

  • 增加max_connections參數的值,不會佔用太多系統資源。系統資源(CPU、內存)的佔用主要取決於查詢的密度、效率等;

  • 該參數設置過小的最明顯特徵是出現」Too many connections」錯誤

  • mysql> show variables like '%max_connect%';

  • +-----------------------+-------+

  • | Variable_name | Value |

  • +-----------------------+-------+

  • | extra_max_connections | 1 |

  • | max_connect_errors | 100 |

  • | max_connections | 2048 |

  • +-----------------------+-------+3 rows in set (0.00 sec)


  • mysql> show status like 'Threads%';

  • +-------------------+---------+

  • | Variable_name | Value |

  • +-------------------+---------+

  • | Threads_cached | 0 |

  • | Threads_connected | 1 |

  • | Threads_created | 9626717 |

  • | Threads_running | 1 |

  • +-------------------+---------+4 rows in set (0.00 sec)

  • 可以看到此時的並發數也就是Threads_connected=1,還遠遠達不到2048

  • mysql> show variables like 'open_files_limit';

  • +------------------+-------+

  • | Variable_name | Value |

  • +------------------+-------+

  • | open_files_limit | 65535 |

  • +------------------+-------+1 row in set (0.00 sec)

  • max_connections 還取決於操作系統對單進程允許打開最大文件數的限制

    也就是說如果操作系統限制單個進程最大可以打開100個文件

    那麼 max_connections 設置為200也沒什麼用

    MySQL 的 open_files_limit 參數值是在MySQL啟動時記錄的操作系統對單進程打開最大文件數限制的值

    可以使用 show variables like 'open_files_limit'; 查看 open_files_limit 值

  • ulimit -n65535

  • 或者直接在 Linux 下通過ulimit -n命令查看操作系統對單進程打開最大文件數限制 ( 默認為1024 )

    connection級內存參數(線程獨享)

    connection級參數,是在每個connection第一次需要使用這個buffer的時候,一次性分配設置的內存。

    排序性能

    mysql對於排序,使用了兩個變數來控制sort_buffer_size和 max_length_for_sort_data, 不象oracle使用SGA控制. 這種方式的缺點是要單獨控制,容易出現排序性能問題.

  • mysql> SHOW GLOBAL STATUS like '%sort%';

  • +---------------------------+--------+

  • | Variable_name | Value |

  • +---------------------------+--------+

  • | Sort_merge_passes | 0 |

  • | Sort_priority_queue_sorts | 1409 |

  • | Sort_range | 0 |

  • | Sort_rows | 843479 |

  • | Sort_scan | 13053 |

  • +---------------------------+--------+5 rows in set (0.00 sec)

  • 如果發現Sort_merge_passes的值比較大,你可以考慮增加sort_buffer_size來加速ORDER BY 或者GROUP BY 操作,不能通過查詢或者索引優化的。我們這為0,那就沒必要設置那麼大。

  • 讀取緩存

    read_buffer_size = 128K(默認128K)為需要全表掃描的MYISAM數據表線程指定緩存

    read_rnd_buffer_size = 4M:(默認256K)首先,該變數可以被任何存儲引擎使用,當從一個已經排序的鍵值表中讀取行時,會先從該緩沖區中獲取而不再從磁碟上獲取。

    大事務binlog

  • mysql> show global status like 'binlog_cache%';

  • +-----------------------+----------+

  • | Variable_name | Value |

  • +-----------------------+----------+

  • | Binlog_cache_disk_use | 220840 |

  • | Binlog_cache_use | 67604667 |

  • +-----------------------+----------+2 rows in set (0.00 sec)

  • Binlog_cache_disk_use表示因為我們binlog_cache_size設計的內存不足導致緩存二進制日誌用到了臨時文件的次數

  • Binlog_cache_use 表示 用binlog_cache_size緩存的次數

  • 當對應的Binlog_cache_disk_use 值比較大的時候 我們可以考慮適當的調高 binlog_cache_size 對應的值

  • 如上圖,現網是32K,我們加到64K

  • join語句內存影響

    如果應用中,很少出現join語句,則可以不用太在乎join_buffer_size參數的設置大小。

    如果join語句不是很少的話,個人建議可以適當增大join_buffer_size到1MB左右,如果內存充足可以設置為2MB。

    線程內存影響

    Thread_stack:每個連接線程被創建時,MySQL給它分配的內存大小。當MySQL創建一個新的連接線程時,需要給它分配一定大小的內存堆棧空間,以便存放客戶端的請求的Query及自身的各種狀態和處理信息。

  • mysql> show status like '%threads%';

  • +-------------------------+---------+

  • | Variable_name | Value |

  • +-------------------------+---------+

  • | Delayed_insert_threads | 0 |

  • | Slow_launch_threads | 0 |

  • | Threadpool_idle_threads | 0 |

  • | Threadpool_threads | 0 |

  • | Threads_cached | 0 |

  • | Threads_connected | 1 |

  • | Threads_created | 9649301 |

  • | Threads_running | 1 |

  • +-------------------------+---------+8 rows in set (0.00 sec)


  • mysql> show status like 'connections';

  • +---------------+---------+

  • | Variable_name | Value |

  • +---------------+---------+

  • | Connections | 9649311 |

  • +---------------+---------+1 row in set (0.00 sec)

  • 如上:系統啟動到現在共接受到客戶端的連接9649311次,共創建了9649301個連接線程,當前有1個連接線程處於和客戶端連接的狀態。而在Thread Cache池中共緩存了0個連接線程(Threads_cached)。

    Thread Cache 命中率:

  • Thread_Cache_Hit = (Connections - Threads_created) / Connections * 100%;

  • 一般在系統穩定運行一段時間後,Thread Cache命中率應該保持在90%左右才算正常。

    內存臨時表

    tmp_table_size 控制內存臨時表的最大值,超過限值後就往硬碟寫,寫的位置由變數 tmpdir 決定

    max_heap_table_size 用戶可以創建的內存表(memory table)的大小.這個值用來計算內存表的最大行數值。

    Order By 或者Group By操作多的話,加大這兩個值,默認16M

  • mysql> show status like 'Created_tmp_%';

  • +-------------------------+-------+

  • | Variable_name | Value |

  • +-------------------------+-------+

  • | Created_tmp_disk_tables | 0 |

  • | Created_tmp_files | 626 |

  • | Created_tmp_tables | 3 |

  • +-------------------------+-------+3 rows in set (0.00 sec)

  • 如上圖,寫入硬碟的為0,3次中間表,說明我們的默認值足夠用了

  • mariadb 推薦配置

  • 注意這里只推薦innodb引擎

  • 內存配置只關注有注釋的行

  • [mysqld]

  • datadir=/var/lib/mysql

  • socket=/var/lib/mysql/mysql.sockdefault-storage-engine=INNODB


  • character-set-server=utf8

  • collation-server=utf8_general_ci


  • user=mysql

  • symbolic-links=0# global settings

  • table_cache=65535table_definition_cache=65535max_allowed_packet=4M

  • net_buffer_length=1M

  • bulk_insert_buffer_size=16M


  • query_cache_type=0 #是否使用查詢緩沖,0關閉

  • query_cache_size=0 #0關閉,因為改表操作多,命中低,開啟消耗cpu


  • # shared

  • key_buffer_size=8M #保持8M MyISAM索引用

  • innodb_buffer_pool_size=4G #DB專用mem*50%,非DB專用mem*15%到25%

  • myisam_sort_buffer_size=32M

  • max_heap_table_size=16M #最大中間表大小

  • tmp_table_size=16M #中間表大小


  • # per-thread

  • sort_buffer_size=256K #加速排序緩存大小

  • read_buffer_size=128k #為需要全表掃描的MYISAM數據表線程指定緩存

  • read_rnd_buffer_size=4M #已排序的表讀取時緩存,如果比較大內存就到6M

  • join_buffer_size=1M #join語句多時加大,1-2M

  • thread_stack=256k #線程空間,256K or 512K

  • binlog_cache_size=64K #大事務binlog



  • # big-tables

  • innodb_file_per_table = 1skip-external-locking

  • max_connections=2048 #最大連接數

  • skip-name-resolve


  • # slow_query_log

  • slow_query_log_file = /var/log/mysql-slow.log

  • long_query_time = 30group_concat_max_len=65536# according to tuning-primer.sh

  • thread_cache_size = 8thread_concurrency = 16# set variables

  • concurrent_insert=2

  • 運行時修改

    使用以下命令來修改變數

  • set global {要改的key} = {值}; (立即生效重啟後失效)

  • set @@{要改的key} = {值}; (立即生效重啟後失效)

  • set @@global.{要改的key} = {值}; (立即生效重啟後失效)

  • 試驗

  • mysql> set @@global.innodb_buffer_pool_size=4294967296;

  • ERROR 1238 (HY000): Variable 'innodb_buffer_pool_size' is a read only variable

  • mysql> set @@global.thread_stack=262144;

  • ERROR 1238 (HY000): Variable 'thread_stack' is a read only variable

  • mysql> set @@global.binlog_cache_size=65536;

  • Query OK, 0 rows affected (0.00 sec)

  • mysql> set @@join_buffer_size=1048576;

  • Query OK, 0 rows affected (0.00 sec)

  • mysql> set @@read_rnd_buffer_size=4194304;

  • Query OK, 0 rows affected (0.00 sec)

  • mysql> set @@sort_buffer_size=262144;

  • Query OK, 0 rows affected (0.00 sec)

  • mysql> set @@read_buffer_size=131072;

  • Query OK, 0 rows affected (0.00 sec)

  • mysql> set global key_buffer_size=8388608;

  • Query OK, 0 rows affected (0.39 sec)

  • 我們可以看到innodb_buffer_pool_size和thread_stack報錯了,他們只能改配置文件,在運行時是只讀的。 以下直接復制使用

  • set @@global.binlog_cache_size=65536;

  • set @@join_buffer_size=1048576;

  • set @@read_rnd_buffer_size=4194304;

  • set @@sort_buffer_size=262144;

  • set @@read_buffer_size=131072;

  • set global key_buffer_size=8388608;

『貳』 myisam索引緩沖區大小 怎麼設置

MyISAM:這個是默認類型,它是基於傳統的ISAM類型,ISAM是Indexed Sequential Access Method (有索引的 順序訪問方法) 的縮寫,它是存儲記錄和文件的標准方法.與其他存儲引擎比較,MyISAM具有檢查和修復表格的大多數工具. MyISAM表格可以被壓縮,而且它們支持全文搜索.它們不是事務安全的,而且也不支持外鍵。如果事物回滾將造成不完全回滾,不具有原子性。如果執行大量 的SELECT,MyISAM是更好的選擇。

『叄』 mysql 8.0 為什麼 要廢棄myisam

InnoDB存儲數據字典,這意味著MyISAM已經可以完全從MySQL資料庫中剝離;
Invisible Index,Inside君對這個特性非常感興趣。因為在生產環境中,可以通過sys庫判斷哪些索引是冗餘的。但是要直接刪除冗餘索引又擔心會存在一些風險。Invisible Index給了我們很好的選擇;
角色表功能,官方MySQL終於提供了Role功能。InnoSQL傲嬌的表示我們在5.5就實現了此功能,甚至比MariaDB還要早。要知道在游戲行業,定期密碼修改總是一個令人頭疼的問題,有Role就簡單多了。當然,InnoSQL還可以對Role進行資源控制,不知道8.0實現的怎樣;

Cost Model改進,優化器能夠感知到頁是否存在緩沖池中。5.7其實已經開放介面,但是不對內存中的頁進行統計,返回都是1.0;

直巧巧方圖支持,MySQL也支持直方圖啦。應該會有更好的執行計劃。海翔兄在IMG大會中說到過此特性,聽說性能提升非常不錯;
參數持久化,繼續與Oracle資料庫靠近,但本身這個特性就是硬需求。話說這些年有多少因為沒有參數持久化導致的坑發生;
掃描性能的改進,InnoDB全表掃描或范圍查詢性能提升5%~20%。請問之前HT寫的代碼有這么爛?

重構BLOB的實現,從而提升JSON屬性的更新。個人感覺這方面性能的提升可能會非常大。留個爪,後孝燃鍵面進行測試;
持久化自增值,這些年淘寶、Percona都做過類似的改進。但是官方的修改段橘就是優雅,自增寫redo,一個歷史遺留難題就這么簡單而又優雅的解決了;

PS庫添加索引,官方宣稱添加了100多個索引。的確,Inside君遇到過很多時候PS庫佔用20G內存的場景,這時查詢就會顯得非常不高效。但是內存開銷會不會進一步提升呢?讓我們拭目以待吧;

『肆』 MSSQL Server 自定義的函數

[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
socket = /tmp/mysql.sock

basedir = /usr/local/mysql
datadir = /data/mysql
pid-file = /data/mysql/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1 #表示是本機的序號為1,一般來講就是master的意思

skip-name-resolve
# 禁止MySQL對外部連接進行DNS解析,使用這一選項可以消除MySQL進行DNS解析的時間。但需要注意,如果開啟該選項,
# 則所有遠程主機連接授權都要使用IP地址方式,否則MySQL將無法正常處理連接請求

#skip-networking

back_log = 600
# MySQL能有的連接數量。當主要MySQL線程在一個很短時間內得到非常多的連接請求,這就起作用,
# 然後主線程花些時間(盡管很短)檢查連接並且啟動一個新線程。back_log值指出在MySQL暫時停止回答新請求之前的短時間內多少個請求可以被存在堆棧中。
# 如果期望在一個短時間內有很多連接,你需要增加它。也就是說,如果MySQL的連接數據達到max_connections時,新來的請求將會被存在堆棧中,
# 以等待某一連接釋放資源,該堆棧的數量即back_log,如果等待連接的數量超過back_log,將不被授予連接資源。
# 另外,這值(back_log)限於您的操作系統對到來的TCP/IP連接的偵聽隊列的大小。
# 你的操作系統在這個隊列大小上有它自己的限制(可以檢查你的OS文檔找出這個變數的最大值),試圖設定back_log高於你的操作系統的限制將是無效的。

max_connections = 1000
#
MySQL的最大連接數,如果伺服器的並發連接請求量比較大,建議調高此值,以增加並行連接數量,當然這建立在機器能支撐的情況下,因為如果扒談譽連接數越多,
介於MySQL會為每個連接提供連接緩沖區,就會開銷越多的內存,所以要適當調整該值,不能盲目提高設值。可以過'conn%'通配符查看當前狀態的連接
數量,以定奪該值的大小。

max_connect_errors = 6000
# 對於同一主機,如果有超出該參數值個數的春段中斷錯誤連接,則該主機將被禁止連接。如需對該主機進行解禁,執行:FLUSH HOST。

open_files_limit = 65535
# MySQL打開的文件描述符限制,默認最小1024;當open_files_limit沒有被配置的時候,比較max_connections*5和ulimit -n的值,哪個大用哪個,
# 當open_file_limit被配置的時候,比較侍巧open_files_limit和max_connections*5的值,哪個大用哪個。

table_open_cache = 128
# MySQL每打開一個表,都會讀入一些數據到table_open_cache緩存中,當MySQL在這個緩存中找不到相應信息時,才會去磁碟上讀取。默認值64
# 假定系統有200個並發連接,則需將此參數設置為200*N(N為每個連接所需的文件描述符數目);
# 當把table_open_cache設置為很大時,如果系統處理不了那麼多文件描述符,那麼就會出現客戶端失效,連接不上

max_allowed_packet = 4M
# 接受的數據包大小;增加該變數的值十分安全,這是因為僅當需要時才會分配額外內存。例如,僅當你發出長查詢或MySQLd必須返回大的結果行時MySQLd才會分配更多內存。
# 該變數之所以取較小默認值是一種預防措施,以捕獲客戶端和伺服器之間的錯誤信息包,並確保不會因偶然使用大的信息包而導致內存溢出。

binlog_cache_size = 1M
# 一個事務,在沒有提交的時候,產生的日誌,記錄到Cache中;等到事務提交需要提交的時候,則把日誌持久化到磁碟。默認binlog_cache_size大小32K

max_heap_table_size = 8M
# 定義了用戶可以創建的內存表(memory table)的大小。這個值用來計算內存表的最大行數值。這個變數支持動態改變

tmp_table_size = 16M
# MySQL的heap(堆積)表緩沖大小。所有聯合在一個DML指令內完成,並且大多數聯合甚至可以不用臨時表即可以完成。
# 大多數臨時表是基於內存的(HEAP)表。具有大的記錄長度的臨時表 (所有列的長度的和)或包含BLOB列的表存儲在硬碟上。
#

如果某個內部heap(堆積)表大小超過tmp_table_size,MySQL可以根據需要自動將內存中的heap表改為基於硬碟的MyISAM表。
還可以通過設置tmp_table_size選項來增加臨時表的大小。也就是說,如果調高該值,MySQL同時將增加heap表的大小,可達到提高聯接查
詢速度的效果

read_buffer_size = 2M
# MySQL讀入緩沖區大小。對表進行順序掃描的請求將分配一個讀入緩沖區,MySQL會為它分配一段內存緩沖區。read_buffer_size變數控制這一緩沖區的大小。
# 如果對表的順序掃描請求非常頻繁,並且你認為頻繁掃描進行得太慢,可以通過增加該變數值以及內存緩沖區大小提高其性能

read_rnd_buffer_size = 8M
# MySQL的隨機讀緩沖區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,
# MySQL會首先掃描一遍該緩沖,以避免磁碟搜索,提高查詢速度,如果需要排序大量數據,可適當調高該值。但MySQL會為每個客戶連接發放該緩沖空間,所以應盡量適當設置該值,以避免內存開銷過大

sort_buffer_size = 8M
# MySQL執行排序使用的緩沖大小。如果想要增加ORDER BY的速度,首先看是否可以讓MySQL使用索引而不是額外的排序階段。
# 如果不能,可以嘗試增加sort_buffer_size變數的大小

join_buffer_size = 8M
# 聯合查詢操作所能使用的緩沖區大小,和sort_buffer_size一樣,該參數對應的分配內存也是每連接獨享

thread_cache_size = 8
# 這個值(默認8)表示可以重新利用保存在緩存中線程的數量,當斷開連接時如果緩存中還有空間,那麼客戶端的線程將被放到緩存中,
# 如果線程重新被請求,那麼請求將從緩存中讀取,如果緩存中是空的或者是新的請求,那麼這個線程將被重新創建,如果有很多新的線程,
# 增加這個值可以改善系統性能.通過比較Connections和Threads_created狀態的變數,可以看到這個變數的作用。(–>表示要調整的值)
# 根據物理內存設置規則如下:
# 1G —> 8
# 2G —> 16
# 3G —> 32
# 大於3G —> 64

query_cache_size = 8M
#MySQL的查詢緩沖大小(從4.0.1開始,MySQL提供了查詢緩沖機制)使用查詢緩沖,MySQL將SELECT語句和查詢結果存放在緩沖區中,
# 今後對於同樣的SELECT語句(區分大小寫),將直接從緩沖區中讀取結果。根據MySQL用戶手冊,使用查詢緩沖最多可以達到238%的效率。
# 通過檢查狀態值'Qcache_%',可以知道query_cache_size設置是否合理:如果Qcache_lowmem_prunes的值非常大,則表明經常出現緩沖不夠的情況,
# 如果Qcache_hits的值也非常大,則表明查詢緩沖使用非常頻繁,此時需要增加緩沖大小;如果Qcache_hits的值不大,則表明你的查詢重復率很低,
# 這種情況下使用查詢緩沖反而會影響效率,那麼可以考慮不用查詢緩沖。此外,在SELECT語句中加入SQL_NO_CACHE可以明確表示不使用查詢緩沖

query_cache_limit = 2M
#指定單個查詢能夠使用的緩沖區大小,默認1M

key_buffer_size = 4M
#指定用於索引的緩沖區大小,增加它可得到更好處理的索引(對所有讀和多重寫),到你能負擔得起那樣多。如果你使它太大,
# 系統將開始換頁並且真的變慢了。對於內存在4GB左右的伺服器該參數可設置為384M或512M。通過檢查狀態值Key_read_requests和Key_reads,
# 可以知道key_buffer_size設置是否合理。比例key_reads/key_read_requests應該盡可能的低,
# 至少是1:100,1:1000更好(上述狀態值可以使用SHOW STATUS LIKE 'key_read%'獲得)。注意:該參數值設置的過大反而會是伺服器整體效率降低

ft_min_word_len = 4
# 分詞詞彙最小長度,默認4

transaction_isolation = REPEATABLE-READ
# MySQL支持4種事務隔離級別,他們分別是:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
# 如沒有指定,MySQL默認採用的是REPEATABLE-READ,ORACLE默認的是READ-COMMITTED

log_bin = mysql-bin
binlog_format = mixed
expire_logs_days = 30 #超過30天的binlog刪除

log_error = /data/mysql/mysql-error.log #錯誤日誌路徑
slow_query_log = 1
long_query_time = 1 #慢查詢時間 超過1秒則為慢查詢
slow_query_log_file = /data/mysql/mysql-slow.log

performance_schema = 0
explicit_defaults_for_timestamp

#lower_case_table_names = 1 #不區分大小寫

skip-external-locking #MySQL選項以避免外部鎖定。該選項默認開啟

default-storage-engine = InnoDB #默認存儲引擎

innodb_file_per_table = 1
# InnoDB為獨立表空間模式,每個資料庫的每個表都會生成一個數據空間
# 獨立表空間優點:
# 1.每個表都有自已獨立的表空間。
# 2.每個表的數據和索引都會存在自已的表空間中。
# 3.可以實現單表在不同的資料庫中移動。
# 4.空間可以回收(除drop table操作處,表空不能自已回收)
# 缺點:
# 單表增加過大,如超過100G
# 結論:
# 共享表空間在Insert操作上少有優勢。其它都沒獨立表空間表現好。當啟用獨立表空間時,請合理調整:innodb_open_files

innodb_open_files = 500
# 限制Innodb能打開的表的數據,如果庫里的表特別多的情況,請增加這個。這個值默認是300

innodb_buffer_pool_size = 64M
# InnoDB使用一個緩沖池來保存索引和原始數據, 不像MyISAM.
# 這里你設置越大,你在存取表裡面數據時所需要的磁碟I/O越少.
# 在一個獨立使用的資料庫伺服器上,你可以設置這個變數到伺服器物理內存大小的80%
# 不要設置過大,否則,由於物理內存的競爭可能導致操作系統的換頁顛簸.
# 注意在32位系統上你每個進程可能被限制在 2-3.5G 用戶層面內存限制,
# 所以不要設置的太高.

innodb_write_io_threads = 4
innodb_read_io_threads = 4
# innodb使用後台線程處理數據頁上的讀寫 I/O(輸入輸出)請求,根據你的 CPU 核數來更改,默認是4
# 注:這兩個參數不支持動態改變,需要把該參數加入到my.cnf里,修改完後重啟MySQL服務,允許值的范圍從 1-64

innodb_thread_concurrency = 0
# 默認設置為 0,表示不限制並發數,這里推薦設置為0,更好去發揮CPU多核處理能力,提高並發量

innodb_purge_threads = 1
# InnoDB中的清除操作是一類定期回收無用數據的操作。在之前的幾個版本中,清除操作是主線程的一部分,這意味著運行時它可能會堵塞其它的資料庫操作。
# 從MySQL5.5.X版本開始,該操作運行於獨立的線程中,並支持更多的並發數。用戶可通過設置innodb_purge_threads配置參數來選擇清除操作是否使用單
# 獨線程,默認情況下參數設置為0(不使用單獨線程),設置為 1 時表示使用單獨的清除線程。建議為1

innodb_flush_log_at_trx_commit = 2
# 0:如果innodb_flush_log_at_trx_commit的值為0,log buffer每秒就會被刷寫日誌文件到磁碟,提交事務的時候不做任何操作(執行是由mysql的master thread線程來執行的。
# 主線程中每秒會將重做日誌緩沖寫入磁碟的重做日誌文件(REDO LOG)中。不論事務是否已經提交)默認的日誌文件是ib_logfile0,ib_logfile1
# 1:當設為默認值1的時候,每次提交事務的時候,都會將log buffer刷寫到日誌。
# 2:如果設為2,每次提交事務都會寫日誌,但並不會執行刷的操作。每秒定時會刷到日誌文件。要注意的是,並不能保證100%每秒一定都會刷到磁碟,這要取決於進程的調度。
# 每次事務提交的時候將數據寫入事務日誌,而這里的寫入僅是調用了文件系統的寫入操作,而文件系統是有 緩存的,所以這個寫入並不能保證數據已經寫入到物理磁碟
# 默認值1是為了保證完整的ACID。當然,你可以將這個配置項設為1以外的值來換取更高的性能,但是在系統崩潰的時候,你將會丟失1秒的數據。
# 設為0的話,mysqld進程崩潰的時候,就會丟失最後1秒的事務。設為2,只有在操作系統崩潰或者斷電的時候才會丟失最後1秒的數據。InnoDB在做恢復的時候會忽略這個值。
# 總結
# 設為1當然是最安全的,但性能頁是最差的(相對其他兩個參數而言,但不是不能接受)。如果對數據一致性和完整性要求不高,完全可以設為2,如果只最求性能,例如高並發寫的日誌伺服器,設為0來獲得更高性能

innodb_log_buffer_size = 2M
# 此參數確定些日誌文件所用的內存大小,以M為單位。緩沖區更大能提高性能,但意外的故障將會丟失數據。MySQL開發人員建議設置為1-8M之間

innodb_log_file_size = 32M
# 此參數確定數據日誌文件的大小,更大的設置可以提高性能,但也會增加恢復故障資料庫所需的時間

innodb_log_files_in_group = 3
# 為提高性能,MySQL可以以循環方式將日誌文件寫到多個文件。推薦設置為3

innodb_max_dirty_pages_pct = 90
# innodb主線程刷新緩存池中的數據,使臟數據比例小於90%

innodb_lock_wait_timeout = 120
# InnoDB事務在被回滾之前可以等待一個鎖定的超時秒數。InnoDB在它自己的鎖定表中自動檢測事務死鎖並且回滾事務。InnoDB用LOCK TABLES語句注意到鎖定設置。默認值是50秒

bulk_insert_buffer_size = 8M
# 批量插入緩存大小, 這個參數是針對MyISAM存儲引擎來說的。適用於在一次性插入100-1000+條記錄時, 提高效率。默認值是8M。可以針對數據量的大小,翻倍增加。

myisam_sort_buffer_size = 8M
# MyISAM設置恢復表之時使用的緩沖區的尺寸,當在REPAIR TABLE或用CREATE INDEX創建索引或ALTER TABLE過程中排序 MyISAM索引分配的緩沖區

myisam_max_sort_file_size = 10G
# 如果臨時文件會變得超過索引,不要使用快速排序索引方法來創建一個索引。注釋:這個參數以位元組的形式給出

myisam_repair_threads = 1
# 如果該值大於1,在Repair by sorting過程中並行創建MyISAM表索引(每個索引在自己的線程內)

interactive_timeout = 28800
# 伺服器關閉互動式連接前等待活動的秒數。互動式客戶端定義為在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。默認值:28800秒(8小時)

wait_timeout = 28800
# 伺服器關閉非交互連接之前等待活動的秒數。在線程啟動時,根據全局wait_timeout值或全局interactive_timeout值初始化會話wait_timeout值,
# 取決於客戶端類型(由mysql_real_connect()的連接選項CLIENT_INTERACTIVE定義)。參數默認值:28800秒(8小時)
# MySQL伺服器所支持的最大連接數是有上限的,因為每個連接的建立都會消耗內存,因此我們希望客戶端在連接到MySQL Server處理完相應的操作後,
# 應該斷開連接並釋放佔用的內存。如果你的MySQL Server有大量的閑置連接,他們不僅會白白消耗內存,而且如果連接一直在累加而不斷開,
# 最終肯定會達到MySQL Server的連接上限數,這會報'too many connections'的錯誤。對於wait_timeout的值設定,應該根據系統的運行情況來判斷。
# 在系統運行一段時間後,可以通過show processlist命令查看當前系統的連接狀態,如果發現有大量的sleep狀態的連接進程,則說明該參數設置的過大,
# 可以進行適當的調整小些。要同時設置interactive_timeout和wait_timeout才會生效。

[mysqlmp]
quick
max_allowed_packet = 16M #伺服器發送和接受的最大包長度
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M

『伍』 mysql的innodb和myisam的區別

MYISAM 表是典型的數據與索引分離存儲,主鍵和二級索引沒有本質區別。比如在 MYISAM 表裡主鍵、唯一索引是一樣的,沒有本質區別。
MYISAM 表的索引存儲方式最大的缺點沒有按照物理數據行順序存儲,這樣無論對主鍵的檢索還是對二級索引的檢索都需要進行二次排序。兄做
INNODB 表本身是索引組織表,也就是說索引就是數據。下圖表T1的數據行以聚簇索引的方式展示,非葉子節點保存了主鍵的值,葉子節點保存了主鍵的值頃旁以及對應的數據行,並且每個頁有分別指向前後兩頁的指針。
INNODB 表不同於 MYISAM,INNODB 表有自己的數據頁管理,默認 16KB。MYISAM 表數據的管理依賴文件系統,比如文件系統一般默認 4KB,MYISAM 的塊大小也是 4KB,MYISAM 表的沒有自己的一套崩潰恢復機制,全部依賴於文件系統。
INNODB 表這樣設計的優點有兩個:
1. 數據按照主鍵順序存儲。主鍵的順序也就是記錄行的物理順序,相比指向數據行指針的存放方式,避免了再次排序。
2. 兩個葉子節點分別含有指向前後兩個節點的指針,這樣在插入新行或者進行頁分裂時,只需要移動對應的指針即可。
但是也有缺點:
1. 二級索引由於同時保存了主鍵值,體積會變大。特別是主鍵設計不合理的時候,比如用 UUID 做主鍵。
2. 對二級索引的檢索需要檢索兩羨乎衡次索引樹。第一次通過檢索二級索引葉子節點,找到過濾行對應的主鍵值;第二次通過這個主鍵的值去聚簇索引中查找對應的行。

『陸』 mysql修改數據表存儲引擎為MyISAM

先將資料庫導出啊,搞成SQL腳本
然後吧INNODB替換成MYISAM- -
我以前是這么做的
但是INNODB好用得多啊- -~~~
好像沒有更好的辦法了,批量改不這樣做的話那就是自己寫腳本?那對於資料庫本身而言更麻煩,中間會產生很多問題......

可不可以先導出結構,在另一台伺服器上把結構修改好之後然後做個COPY或者是熱備?

而且INNODB參數設置得當的情況下效率也差不了多少,在大並發量的情況下性能完全優於MYISAM引擎的,特別是行級鎖這東西.....很好用

『柒』 如何用redis/memcache做Mysql緩存層

有兩種方法,一種方法使用mysql的check table和repair table 的sql語句,另一種方法是使用MySQL提供的多個myisamchk, isamchk數據檢測恢復工具。前者使用起來比較簡便。推薦使用。
1. check table 和 repair table
登陸mysql 終端:
mysql -uxxxxx -p dbname
check table tabTest;
如果出現的結果說Status是OK,則不用修復,如果有Error,可以用:
repair table tabTest;
進行修復,修復之後可以在用check table命令來進行檢查。在新版本的phpMyAdmin裡面也可以使用check/repair的功能。
2. myisamchk, isamchk
其中myisamchk適用於MYISAM類型的數棗絕據表,而isamchk適用於ISAM類型的數據表。這兩條命令的主要參數相同,一般新的系統都使用MYISAM作為預設的數據表類型,這里以myisamchk為例子進行說明。當發現某個數據表出現問題時可以使用:
myisamchk tablename.MYI
進行檢測,如果需要修復的話,凳粗姿可以使用:
myisamchk -of tablename.MYI
關於myisamchk的詳細參數說明,可以參見它的使用幫助。需要注意的時在進行修改時必須確保MySQL伺服器沒有訪問這個數據表,保險的情況下是最好在進行檢測時把MySQL伺服器Shutdown掉。
-----------------------------
另外可以把下面的命令放在你的rc.local裡面啟動MySQL伺服器前:
[ -x /tmp/mysql.sock ] && /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI
其中的/tmp/mysql.sock是MySQL監聽的Sock文件位置,對於使用RPM安裝的用戶應該是/var/lib/mysql/mysql.sock,對於使用源碼安裝則是/tmp/mysql.sock可以根據自己凳慎的實際情況進行變更,而pathtochk則是myisamchk所在的位置,DATA_DIR是你的MySQL資料庫存放的位置。
需要注意的時,如果你打算把這條命令放在你的rc.local裡面,必須確認在執行這條指令時MySQL伺服器必須沒有啟動!檢測修復所有資料庫(表)

『捌』 mysql存儲引擎類型有哪些

1、MyISAM

使用這個存儲引擎,每個MyISAM在磁碟上存儲成三個文件。

(1)frm文件:存儲表的定義數據

(2)MYD文件:存放表具體記錄的數據

(3)MYI文件:存儲索引

frm和MYI可以存放在不同的目錄下。MYI文件用來存儲索引,但僅保存記錄所在頁的指針,索引的結構是B+樹結構。下面這張圖就是MYI文件保存的機制:

從這張圖可以發現,這個存儲引擎通過MYI的B+樹結構來查找記錄頁,再根據記錄頁查找記錄。並且支持全文索引、B樹索引和數據壓縮。

支持數據的類型也有三種:

(1)靜態固定長度表

這種方式的優點在於存儲速度非常快,容易發生緩存,而且表發生損壞後也容易修復。缺點是占空間。這也是默認的存儲格式。

(2)動態可變長表

優點是節省空間,但是一旦出錯恢復起來比較麻煩。

(3)壓縮表

上面說到支持數據壓縮,說明肯定也支持這個格式。在數據文件發生錯誤時候,可以使用check table工具來檢查,而且還可以使用repair table工具來恢復。

有一個重要的特點那就是不支持事務,但是這也意味著他的存儲速度更快,如果你的讀寫操作允許有錯誤數據的話,只是追求速度,可以選擇這個存儲引擎。

2、InnoDB

InnoDB是默認的資料庫存儲引擎,他的主要特點有:

(1)可以通過自動增長列,方法是auto_increment。

(2)支持事務。默認的事務隔離級別為可重復度,通過MVCC(並發版本控制)來實現的。

(3)使用的鎖粒度為行級鎖,可以支持更高的並發;

(4)支持外鍵約束;外鍵約束其實降低了表的查詢速度,但是增加了表之間的耦合度。

(5)配合一些熱備工具可以支持在線熱備份;

(6)在InnoDB中存在著緩沖管理,通過緩沖池,將索引和數據全部緩存起來,加快查詢的速度;

(7)對於InnoDB類型的表,其數據的物理組織形式是聚簇表。所有的數據按照主鍵來組織。數據和索引放在一塊,都位於B+數的葉子節點上;

當然InnoDB的存儲表和索引也有下面兩種形式:

(1)使用共享表空間存儲:所有的表和索引存放在同一個表空間中。

(2)使用多表空間存儲:表結構放在frm文件,數據和索引放在IBD文件中。分區表的話,每個分區對應單獨的IBD文件,分區表的定義可以查看我的其他文章。使用分區表的好處在於提升查詢效率。

對於InnoDB來說,最大的特點在於支持事務。但是這是以損失效率來換取的。

3、Memory

將數據存在內存,為了提高數據的訪問速度,每一個表實際上和一個磁碟文件關聯。文件是frm。

(1)支持的數據類型有限制,比如:不支持TEXT和BLOB類型,對於字元串類型的數據,只支持固定長度的行,VARCHAR會被自動存儲為CHAR類型;

(2)支持的鎖粒度為表級鎖。所以,在訪問量比較大時,表級鎖會成為MEMORY存儲引擎的瓶頸;

(3)由於數據是存放在內存中,一旦伺服器出現故障,數據都會丟失;

(4)查詢的時候,如果有用到臨時表,而且臨時表中有BLOB,TEXT類型的欄位,那麼這個臨時表就會轉化為MyISAM類型的表,性能會急劇降低;

(5)默認使用hash索引。

(6)如果一個內部表很大,會轉化為磁碟表。

在這里只是給出3個常見的存儲引擎。使用哪一種引擎需要靈活選擇,一個資料庫中多個表可以使用不同引擎以滿足各種性能和實際需求,使用合適的存儲引擎,將會提高整個資料庫的性能

『玖』 請論述下mysql中innodb和myisam的區別和優劣

InnoDB和MyISAM是在使用MySQL最常用的兩個表類型,各有優缺點,視具體應用而定。
下面是已知的兩者之間的差別,僅亂基供參考。

innodb
InnoDB 給 MySQL 提供了具有事務(commit)、回滾(rollback)和崩潰修復能力
(crash recovery capabilities)的事務安全
(transaction-safe (ACID compliant))型表。InnoDB 提供了行鎖
(locking on row level),提供與 Oracle 類型一致的不加鎖讀取(non-locking
read in SELECTs)。這些特性均提高了多用戶並發操作的性能表現。
在InnoDB表中不需要擴大鎖定(lock escalation),因為 InnoDB 的列鎖定(row level
locks)適宜非常小的空間。InnoDB 是 MySQL 上第一個提供外鍵約束(FOREIGN KEY
constraints)的表引擎。

InnoDB 的設計目標是處理大容量資料庫系統,它的 CPU 利用率是其它基於磁碟的關系資料庫
引擎所不能比的。在技術上,InnoDB 是一套放在 MySQL 後台的完整資料庫系統,
InnoDB 在主內存中建立其專用的緩沖池用於高敗陪隱速緩沖數察廳據和索引。 InnoDB 把數據和索引存
放在表空間里,可能包含多個文件,這與其它的不一樣,舉例來說,在 MyISAM 中,表被存放
在單獨的文件中。InnoDB 表的大小隻受限於操作系統的文件大小,一般為 2 GB。
InnoDB所有的表都保存在同一個數據文件 ibdata1 中(也可能是多個文件,或者是獨立的
表空間文件),相對來說比較不好備份,免費的方案可以是拷貝數據文件、備份 binlog,
或者用 mysqlmp。

MyISAM
MyISAM 是MySQL預設存貯引擎 .

每張MyISAM 表被存放在三個文件 。frm 文件存放表格定義。 數據文件是MYD (MYData) 。
索引文件是MYI (MYIndex) 引伸。

因為MyISAM相對簡單所以在效率上要優於InnoDB..小型應用使用MyISAM是不錯的選擇.

MyISAM表是保存成文件的形式,在跨平台的數據轉移中使用MyISAM存儲會省去不少的麻煩

MyISAM是ISAM表的新版本,有如下擴展:

·二進制層次的可移植性。
·NULL列索引。
·對變長行比ISAM表有更少的碎片。
·支持大文件。
·更好的索引壓縮。
·更好的鍵嗎統計分布。
·更好和更快的auto_increment處理。

以下是一些細節和具體實現的差別:

◆1.InnoDB不支持FULLTEXT類型的索引。
◆2.InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,
InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。
注意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的。
◆3.對於AUTO_INCREMENT類型的欄位,InnoDB中必須包含只有該欄位的索引,但是在MyISAM
表中,可以和其他欄位一起建立聯合索引。
◆4.DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。
◆5.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成
MyISAM表,導入數據後再改成InnoDB表,但是對於使用的額外的InnoDB特性(例如外鍵)的
表不適用。

◆MyISAM類型的二進制數據文件可以在不同操作系統中遷移。

另外,InnoDB表的行鎖也不是絕對的,假如在執行一個SQL語句時MySQL不能確定要掃描的
范圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like 「%aaa%」

再另外,使用兩種的選擇:如果你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,
應該使用InnoDB表。如果執行大量的SELECT,MyISAM是更好的選擇。若需要使用事務處理,
但是原來的數據表使用的是myisam,就需要改為bdb或者innodb,這樣基於myisam的程序,
將類型改為innodb後,其程序不用改動……

綜上所述,任何一種表都不是萬能的,只有恰當的針對業務類型來選擇合適的表類型,才能
最大的發揮MySQL的性能優勢。

MyISAM和InnoDB優化:
key_buffer_size - 這對MyISAM表來說非常重要。如果只是使用MyISAM表,可以把它設置
為可用內存的 30-40%。合理的值取決於索引大小、數據量以及負載 -- 記住,MyISAM表會
使用操作系統的緩存來緩存數據,因此需要留出部分內存給它們,很多情況下數據比索引大
多了。盡管如此,需要總是檢查是否所有的 key_buffer 都被利用了 -- .MYI 文件只有 1GB
,而 key_buffer 卻設置為 4GB 的情況是非常少的。這么做太浪費了。如果你很少使用
MyISAM表,那麼也保留低於 16-32MB 的 key_buffer_size 以適應給予磁碟的臨時表索引
所需。
innodb_buffer_pool_size - 這對Innodb表來說非常重要。Innodb相比MyISAM表對緩沖更
為敏感。MyISAM可以在默認的 key_buffer_size 設置下運行的可以,然而Innodb在默認的
innodb_buffer_pool_size 設置下卻跟蝸牛似的。由於Innodb把數據和索引都緩存起來,
無需留給操作系統太多的內存,因此如果只需要用Innodb的話則可以設置它高達 70-80% 的
可用內存。一些應用於 key_buffer 的規則有 -- 如果你的數據量不大,並且不會暴增,那
么無需把
innodb_additional_pool_size - 這個選項對性能影響並不太多,至少在有差不多足夠內存
可分配的操作系統上是這樣。不過如果你仍然想設置為 20MB(或者更大),因此就需要看一下
Innodb其他需要分配的內存有多少。
innodb_log_file_size 在高寫入負載尤其是大數據集的情況下很重要。這個值越大則性能相
對越高,但是要注意到可能會增加恢復時間。我經常設置為 64-512MB,跟據伺服器大小而異。
innodb_log_buffer_size 默認的設置在中等強度寫入負載以及較短事務的情況下,伺服器性
能還可以。如果存在更新操作峰值或者負載較大,就應該考慮加大它的值了。如果它的值設置
太高了,可能會浪費內存 -- 它每秒都會刷新一次,因此無需設置超過1秒所需的內存空間。
通常 8-16MB 就足夠了。越小的系統它的值越小。
innodb_flush_logs_at_trx_commit 是否為Innodb比MyISAM慢1000倍而頭大?看來也許你忘
了修改這個參數了。默認值是 1,這意味著每次提交的更新事務(或者每個事務之外的語句)
都會刷新到磁碟中,而這相當耗費資源,尤其是沒有電池備用緩存時。很多應用程序,尤其是
從 MyISAM轉變過來的那些,把它的值設置為 2 就可以了,也就是不把日誌刷新到磁碟上,
而只刷新到操作系統的緩存上。日誌仍然會每秒刷新到磁碟中去,因此通常不會丟失每秒1-
2次更新的消耗。如果設置為 0 就快很多了,不過也相對不安全了 -- MySQL伺服器崩潰時
就會丟失一些事務。設置為 2 指揮丟失刷新到操作系統緩存的那部分事務。
table_cache -- 打開一個表的開銷可能很大。例如MyISAM把MYI文件頭標志該表正在使用
中。你肯定不希望這種操作太頻繁,所以通常要加大緩存數量,使得足以最大限度地緩存打
開的表。它需要用到操作系統的資源以及內存,對當前的硬體配置來說當然不是什麼問題了。
如果你有200多個表的話,那麼設置為 1024 也許比較合適(每個線程都需要打開表),
如果連接數比較大那麼就加大它的值。我曾經見過設置為 100,000 的情況。
thread_cache -- 線程的創建和銷毀的開銷可能很大,因為每個線程的連接/斷開都需要。
我通常至少設置為 16。如果應用程序中有大量的跳躍並發連接並且 Threads_Created 的值
也比較大,那麼我就會加大它的值。它的目的是在通常的操作中無需創建新線程。
query_cache -- 如果你的應用程序有大量讀,而且沒有應用程序級別的緩存,那麼這很有
用。不要把它設置太大了,因為想要維護它也需要不少開銷,這會導致MySQL變慢。通常設置
為 32-512Mb。設置完之後最好是跟蹤一段時間,查看是否運行良好。在一定的負載壓力下,
如果緩存命中率太低了,就啟用它。
sort_buffer_size --如果你只有一些簡單的查詢,那麼就無需增加它的值了,盡管你有
64GB 的內存。搞不好也許會降低性能

『拾』 innodb和myisam的區別

innodb和myisam的區別為:事務不同、外鍵不同、索引不同。

一、事務不同

1、innodb:innodb不支持事務,無法回滾操作,還原數據。

2、myisam:myisam支持事務,可以回滾操作,還原數據。

二、外鍵不同

1、innodb:innodb支持外鍵。

2、myisam:myisam不支持外鍵。租滲局

三、索引不同

1、innodb:對於自增長的欄位,InnoDB中必須包含只有該欄位的索引。

2、myisam:對於自增弊讓長的欄位,MyISAM表中可以和其他字喊碰段一起建立聯合索引。

熱點內容
我配置很高了ae為什麼卡 發布:2025-05-17 14:54:50 瀏覽:167
python數據分析實戰pdf 發布:2025-05-17 14:49:42 瀏覽:950
海瀾之家廣告腳本 發布:2025-05-17 13:56:06 瀏覽:30
手文件夾恢復 發布:2025-05-17 13:53:32 瀏覽:993
linux怎麼看進程 發布:2025-05-17 13:53:30 瀏覽:303
thinkphp欄位緩存 發布:2025-05-17 13:52:01 瀏覽:575
山靈app安卓版如何設置 發布:2025-05-17 13:51:49 瀏覽:388
帆布壓縮袋 發布:2025-05-17 13:26:27 瀏覽:457
c語言16進製表示方法 發布:2025-05-17 13:11:25 瀏覽:480
ftp單位 發布:2025-05-17 13:10:03 瀏覽:142