<output id="r87xx"></output>
    1. 
      
      <mark id="r87xx"><thead id="r87xx"><input id="r87xx"></input></thead></mark>
        •   

               當(dāng)前位置:首頁>軟件介紹>MySQL緩存技術(shù) 查詢:
               
          MySQL緩存技術(shù)

                  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ā) 


          汽車電子基礎(chǔ)軟件汽車檢測軟件濾波
          汽車維修管理軟件介紹汽車4s管理軟件怎么選
          如何利用汽車維修管理軟件完善汽修廠前臺接待規(guī)范汽車美容管理軟件功能分析
          汽車會員積分管理軟件汽車租賃軟件
          汽車整車構(gòu)造虛擬教學(xué)軟件汽修/汽配/汽車美容軟件
          汽車快修服務(wù)軟件汽車4S店管理軟件
          汽車構(gòu)造仿真教學(xué)軟件MySQL個人學(xué)習(xí)筆記
          MySQL排序語句MySQL入門篇
          信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
          • 勁爆價:
            不限功能
            不限用戶
            1998元/年

          • 微信客服

            <output id="r87xx"></output>
          1. 
            
            <mark id="r87xx"><thead id="r87xx"><input id="r87xx"></input></thead></mark>
              • 艹逼视频在线免费观看 | 国产麻豆成人 | 电家庭影院午夜 | 国产人妖TS重口系列网站观看 | 在线高清视频无码不卡 | 日韩人妻不卡 | 影音先锋人妻啪啪aV资源网站 | 成人福利视频网站 | 蜜臀精品久久久999久久久酒店 | 国产色亭亭视频 |