|
mysql>SHOW VARIABLES LIKE '%query_cache%'; +------------------------------+----------+| Variable_name | Value |+------------------------------+----------+ | have_query_cache | YES | | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 33554432 | | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | +------------------------------+----------+6 rows in set (0.00 sec) have_query_cache 是否支持查詢緩存區(qū) “YES”表是支持查詢緩存區(qū) query_cache_limit 可緩存的Select查詢結(jié)果的最大值 1048576 byte /1024 = 1024kB 即最大可緩存的select查詢結(jié)果必須小于1024KB query_cache_min_res_unit 每次給query cache結(jié)果分配內(nèi)存的大小 默認(rèn)是 4096 byte 也即 4kB 1.當(dāng)查詢進(jìn)行的時候,Mysql把查詢結(jié)果保存在qurey cache中,但是有時候要保存的結(jié)果比較大,超過了query_cache_min_res_unit的值 ,這時候mysql將一邊檢索結(jié)果,一邊進(jìn)行慢慢保存結(jié)果,所以,有時候并不是把所有結(jié)果全部得到后再進(jìn)行一次性保存,而是每次分配一塊query_cache_min_res_unit 大小的內(nèi)存空間保存結(jié)果集,使用完后,接著再分配一個這樣的塊,如果還不不夠,接著再分配一個塊,依此類推,也就是說,有可能在一次查詢中,mysql要進(jìn)行多次內(nèi)存分配的操作,而我們應(yīng)該知道,頻繁操作內(nèi)存都是要耗費時間 的。 2. 內(nèi)存碎片的產(chǎn)生。當(dāng)一塊分配的內(nèi)存沒有完全使用時,MySQL會把這塊內(nèi)存Trim掉,把沒有使用的那部分歸還以重復(fù)利用。比如,第一次分配4KB,只用 了3KB,剩1KB,第二次連續(xù)操作,分配4KB,用了2KB,剩2KB,這兩次連續(xù)操作共剩下的1KB+2KB=3KB,不足以做個一個內(nèi)存單元分配, 這時候,內(nèi)存碎片便產(chǎn)生了。 3.內(nèi)存塊的概念,先看下這個: mysql> show status like 'qcache%'; +-------------------------+----------+| Variable_name | Value |+-------------------------+----------+ | Qcache_free_blocks | 5096 | | Qcache_free_memory | 18964096 | | Qcache_hits | 12192192 | | Qcache_inserts | 3560370 | | Qcache_lowmem_prunes | 17326 | | Qcache_not_cached | 303599 | | Qcache_queries_in_cache | 10201 | | Qcache_total_blocks | 25937 | +-------------------------+----------+8 rows in set (0.00 sec) Qcache_total_blocks 表示所有的塊 Qcache_free_blocks 表示未使用的塊 這個值比較大,那意味著,內(nèi)存碎片比較多,用flush query cache清理后,為被使用的塊其值應(yīng)該為1或0 ,因為這時候所有的內(nèi)存都做為一個連續(xù)的快在一起了: mysql> show status like 'qcache%'; +-------------------------+----------+ | Variable_name | Value |+-------------------------+----------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 18539240 | | Qcache_hits | 12192502 | | Qcache_inserts | 3560515 | | Qcache_lowmem_prunes | 17326 | | Qcache_not_cached | 303607 | | Qcache_queries_in_cache | 10318 | | Qcache_total_blocks | 21081 | +-------------------------+----------+8 rows in set (0.00 sec) 其他幾個狀態(tài)變量的意義: Qcache_free_memory :表示查詢緩存區(qū)現(xiàn)在還有多少的可用內(nèi)存 Qcache_hits :表示查詢緩存區(qū)的命中個數(shù),也就是直接從查詢緩存區(qū)作出響應(yīng)處理的查詢個數(shù) Qcache_inserts :表示查詢緩存區(qū)此前總過緩存過多少條查詢命令的結(jié)果 Qcache_lowmem_prunes :表示查詢緩存區(qū)已滿而從其中溢出和刪除的查詢結(jié)果的個數(shù) Qcache_not_cached :表示沒有進(jìn)入查詢緩存區(qū)的查詢命令個數(shù) Qcache_queries_in_cache :查詢緩存區(qū)當(dāng)前緩存著多少條查詢命令的結(jié)果 優(yōu)化提示: 如果Qcache_lowmem_prunes 值比較大,表示查詢緩存區(qū)大小設(shè)置太小,需要增大。 如果Qcache_free_blocks 較多,表示內(nèi)存碎片較多,需要清理,flush query cache根據(jù)我看的 《High Performance MySQL》中所述,關(guān)于query_cache_min_res_unit大小的調(diào)優(yōu),書中給出了一個計算公式,可以供調(diào)優(yōu)設(shè)置參考: query_cache_min_res_unit = (query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache 還要注意一點的是,F(xiàn)LUSH QUERY CACHE 命令可以用來整理查詢緩存區(qū)的碎片,改善內(nèi)存使 用狀況,但不會清理查詢緩存區(qū)的內(nèi)容,這個要和RESET QUERY CACHE相區(qū)別,不要混淆,后者才是清除查詢緩存區(qū)中的所有的內(nèi)容。 二、mysql事務(wù) 表的類型 :type = innodb活engine = innodb 1、開啟事務(wù) START TRANSACTION 或 BEGIN 2、提交事務(wù)(關(guān)閉事務(wù)) COMMIT 3、放棄事務(wù)(關(guān)閉事務(wù)) ROLLBACK 下列命令自動的結(jié)束一個事務(wù)(就好像你在執(zhí)行這個命令之前做了一個 COMMIT): ALTER TABLE, BEGIN , CREATE INDEX , DROP DATABASE, DROP TABLE, RENAME TABLE , TRUNCATE, 4、折返點 SAVEPOINT adqoo_1 ROLLBACK TO SAVEPOINT adqoo_1 發(fā)生在折返點 adqoo_1 之前的事務(wù)被提交,之后的被忽略 5、事務(wù)的終止 設(shè)置“自動提交”模式 SET AUTOCOMMIT = 0 每條SQL都是同一個事務(wù)的不同命令,之間由 COMMIT 或 ROLLBACK隔開 掉線后,沒有 COMMIT 的事務(wù)都被放棄 6、事務(wù)鎖定模式 系統(tǒng)默認(rèn):不需要等待某事務(wù)結(jié)束,可直接查詢到結(jié)果,但不能再進(jìn)行修改、刪除 缺點:查詢到的結(jié)果,可能是已經(jīng)過期的。 優(yōu)點:不需要等待某事務(wù)結(jié)束,可直接查詢到結(jié)果。 需要用以下模式來設(shè)定鎖定模式 6-1、SELECT …… LOCK IN SHARE MODE(共享鎖) 查詢到的數(shù)據(jù),就是數(shù)據(jù)庫在這一時刻的數(shù)據(jù)(其他已commit事務(wù)的結(jié)果,已經(jīng)反 應(yīng)到這里了) SELECT 必須等待,某個事務(wù)結(jié)束后才能執(zhí)行 6-2、SELECT …… FOR UPDATE(排它鎖) 例如 SELECT * FROM tablename WHERE id<200 那么id<200的數(shù)據(jù),被查詢到的數(shù)據(jù),都將不能再進(jìn)行修改、刪除、SELECT …… LOCK IN SHARE MODE操作 一直到此事務(wù)結(jié)束 共享鎖 和 排它鎖 的區(qū)別:在于是否阻斷其他客戶發(fā)出的 SELECT …… LOCK IN SHARE MODE命令 6-3、INSERT / UPDATE / DELETE 所有關(guān)聯(lián)數(shù)據(jù)都會被鎖定,加上排它鎖 6-4、防插入鎖 例如 SELECT * FROM tablename WHERE id>200 那么id>200的記錄無法被插入 5、死鎖 自動識別死鎖 先進(jìn)來的進(jìn)程被執(zhí)行,后來的進(jìn)程收到出錯消息,并按ROLLBACK方式回滾 innodb_lock_wait_timeout = n 來設(shè)置最長等待時間,默認(rèn)是50秒 7、事務(wù)隔離模式 SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE 7-1、不帶SESSION、GLOBAL的SET命令 只對下一個事務(wù)有效 7-2、SET SESSION 為當(dāng)前會話設(shè)置隔離模式 7-3、SET GLOBAL 為以后新建的所有MYSQL連接設(shè)置隔離模式(當(dāng)前連接不包括在內(nèi)) 8、隔離模式 READ UNCOMMITTED 不隔離SELECT 其他事務(wù)未完成的修改(未COMMIT),其結(jié)果也考慮在內(nèi) READ COMMITTED 把其他事務(wù)的 COMMIT 修改考慮在內(nèi) 同一個事務(wù)中,同一 SELECT 可能返回不同結(jié)果 REPEATABLE READ(默認(rèn)) 不把其他事務(wù)的修改考慮在內(nèi),無論其他事務(wù)是否用COMMIT命令提交過同一個事務(wù)中,同一 SELECT 返回同一結(jié)果(前提是本事務(wù),不修改) SERIALIZABLE 和REPEATABLE READ類似,給所有的SELECT都加上了 共享鎖 出錯處理 根據(jù)出錯信息,執(zhí)行相應(yīng)的處理 InnoDB和MyISAM是在使用MySQL最常用的兩個表類型,各有優(yōu)缺點,視具體應(yīng)用而定。下面是已知的兩者之間的差別,僅供參考。 1.InnoDB不支持FULLTEXT類型的索引。 2.InnoDB 中不保存表的具體行數(shù),也就是說,執(zhí)行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數(shù)即可。注意的是,當(dāng)count(*)語句包含 where條件時,兩種表的操作是一樣的。 3.對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引。 4.DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。 5.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成 MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的.表不適用。 另外,InnoDB表的行鎖也不是絕對的,如果在執(zhí)行一個SQL語句時MySQL不能確定要掃描的范.圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%” 任何一種表都不是萬能的,只用恰當(dāng)?shù)尼槍I(yè)務(wù)類型來選擇合適的表類型,才能最大的發(fā)揮MySQL的性能優(yōu)勢。 6、innoDB支持事務(wù),MyISAM不支持事務(wù),MyISAM:不支持事務(wù),用于只讀程序提高性能 InnoDB:支持ACID事務(wù)、行級鎖、并發(fā)
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|