<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Icc編譯MySQL性能調研_MySQL

        來源:懂視網 責編:小采 時間:2020-11-09 18:00:25
        文檔

        Icc編譯MySQL性能調研_MySQL

        Icc編譯MySQL性能調研_MySQL:bitsCN.com 傳統的c/c++編譯器為GNU的gcc/g++,當然我們也通常使用gcc/g++來編譯MySQL。但是有研究指出gcc/g++編譯器對c/c++優化在某些方面做的并不好。Intel針對自己的處理器特點發布了編譯器icc。本文希望使用icc編譯得到MySQL,然后通過測試得到i
        推薦度:
        導讀Icc編譯MySQL性能調研_MySQL:bitsCN.com 傳統的c/c++編譯器為GNU的gcc/g++,當然我們也通常使用gcc/g++來編譯MySQL。但是有研究指出gcc/g++編譯器對c/c++優化在某些方面做的并不好。Intel針對自己的處理器特點發布了編譯器icc。本文希望使用icc編譯得到MySQL,然后通過測試得到i

        bitsCN.com

        傳統的c/c++編譯器為GNU的gcc/g++,當然我們也通常使用gcc/g++來編譯MySQL。但是有研究指出gcc/g++編譯器對c/c++優化在某些方面做的并不好。Intel針對自己的處理器特點發布了編譯器icc。本文希望使用icc編譯得到MySQL,然后通過測試得到icc編譯出的MySQL在性能等方面的特點。

        1 測試環境

        1.1使用icc編譯器編譯MySQL5.0

        在configure前需要通過CC,CXX等變量改變編譯器為icc。具體命令如下:

        CC=icc CXX=icpc CFLAGS="-O3 -unroll2 -no-gcc –restrict -fPIC" CXXFLAGS="-O3 -unroll2 -no-gcc –restrict -fPIC" ./configure ……

        上述需要注意的是-fPIC參數,如果不添加這個參數,編譯過程中會出現“could not read symbols:bad value”錯誤。

        1.2使用icc編譯器編譯MySQL5.1

        在編譯mysql5.1時,除了像編譯5.0那樣修改CC,CXX參數外,還需要修改mysql5.1(5.1.40)mysys/stacktrace.c中的代碼,以避免編譯過程中出現重定義錯誤。該錯誤是由于icc編譯器和gcc編譯支持的代碼特性不同引起的。

        char __attribute__ ((weak)) *

        my_demangle(const char *mangled_name __attribute__((unused)),

        int *status __attribute__((unused)))

        {

        return NULL;

        }

        改為:

        #if defined(__INTEL_COMPILER)

        #pragma weak my_demangle=my_demangle_null

        char *my_demangle_null(const char *mangled_name, int *status)

        {

        return NULL;

        }

        #else

        char __attribute__ ((weak)) *my_demangle(const char *mangled_name, int *status)

        {

        return NULL;

        }

        #endif /* !__INTEL_COMPILER */

        1.3測試機器及環境

        測試機有4顆CPU,16G內存。Icc編譯的mysql和gcc編譯的mysql同時安裝在這臺機器上,以避免由于機器差異而引起的性能差異。兩個mysql的配置文件是相同的,以避免cache等參數的不同,引起的性能差異。

        2 正確性測試方法及結果

        2.1 正確性測試方法

        本節是驗證icc編譯的mysql在程序邏輯和行為上的正確性。測試方法是選取某數據庫的數據和兩條典型SQL,分別在icc編譯的mysql和gcc編譯的mysql上執行。對比它們的輸出來驗證:icc編譯的mysql執行結果是否和gcc編譯的mysql的執行結果一致。測試包含對InnoDB和MyISAM兩種引擎的分別測試。測試使用的兩個SQL:

        SQL1:select * from tb_customer where urldomain like "%.net" and status=3;

        SQL2:update tb_customer set cust_prov=20 where pose_id=178;

        針對SQL2,在執行完SQL2后,使用“select cust_prov from tb_customer where pose_id=178;”觀察輸出來驗證SQL2執行的正確性。

        2.2 正確性測試結果

        下表中的數據是相關測試結果:

        正確性測試結果

        InnoDB

        MyISAM

        SQL1執行結果的MD5

        SQL2執行結果的MD5

        SQL1執行結果的MD5

        SQL1執行結果的MD5

        Icc編譯的mysql

        6d48abf99ba07623 e98312079c4ae84f

        a76c01d4047639de d05bc06d8b800e96

        6d48abf99ba07623 e98312079c4ae84f

        a76c01d4047639de d05bc06d8b800e96

        Gcc編譯的mysql

        6d48abf99ba07623 e98312079c4ae84f

        a76c01d4047639de d05bc06d8b800e96

        6d48abf99ba07623 e98312079c4ae84f

        a76c01d4047639de d05bc06d8b800e96

        表1

        通過上表可以看出,icc編譯的mysql在上述兩個SQL上執行結果完全一致。通過本節測試可以證明icc編譯的mysql在程序邏輯和行為上的正確性。

        3 性能測試方法

        本節整個測試分成兩部分:1使用sql-bench對icc編譯的mysql和gcc編譯的mysql進行對比測試;2使用mysqlslap、某數據庫數據對兩個編譯版本的mysql進行對比測試。

        3.1使用sql-bench的測試方法

        Sql-bench是一些通用的測試benchmark的集合,這些benchmark覆蓋了多種SQL操作。它們的特點是測試表中的數據量不是太大,測試用的SQL操作豐富。測試方法:運行兩個sql-bench,以相同的bench-mark測試icc編譯的mysql和gcc編譯的mysql。測試中包含針對InnoDB和MyISAM兩種引擎的分別測試。

        在測試過程中統計top中cpu信息和相關mysql進程內存占用信息,然后取均值。這些值均是以占機器總cpu時間,總物理內存的百分比的形式給出。以獲得icc編譯的mysql和gcc編譯的mysql資源占用的比較。同時統計相關SQL集合的執行時間,以獲得兩個編譯版本在執行時間(Qphotoshop/ target=_blank class=infotextkey>PS)上的對比。

        3.2使用mysqlslap的測試方法

        測試工具是mysqlslap,測試數據庫是某數據庫。測試中包含針對InnoDB和MyISAM兩種引擎的分別測試。

        對于InnoDB引擎:測試腳本是從上述數據庫一天的全日制中抽取了10000條update和select類型的SQL。這些SQL組成了全測試腳本。在這個測試腳本的基礎上,從中挑選了3個有代表性的SQL作為3個獨立的測試腳本。

        對于MyISAM引擎,從上面的測試腳本中挑選了4個有代表性的SQL,將它們對應的表轉化成了MyISAM引擎進行測試。

        測試方法:使用mysqlslap,同樣的測試腳本,對icc編譯的mysql和gcc編譯的mysql進行測試。在全腳本測試過程中統計top中cpu信息和相關mysql進程內存占用信息,然后取均值。同時統計相關SQL集合的執行時間。對于后續的單獨SQL測試,由于這些SQL資源消耗比較小,執行時間都比較短,沒有采集執行它們時的資源消耗。

        4 性能測試結果及分析

        4.1使用sql-bench性能測試結果及分析

        使用sql-bench的測試結果如下:

        InnoDB

        執行時間

        Cpu%(us)

        Cpu%(sy)

        Cpu%(id)

        Mem%

        Icc編譯的mysql

        1427s

        20.4

        5.1

        70.8

        7.9

        Gcc編譯的mysql

        1248s

        19.6

        5.9

        70.5

        9.7

        Icc較gcc的優勢

        -14.3%

        -

        -

        -

        -

        MyISAM

        執行時間

        Icc編譯的mysql

        502.69s

        19.1

        8.0

        71.5

        4.4

        Gcc編譯的mysql

        583.88s

        19.6

        7.5

        71.5

        8.0

        Icc較gcc的優勢

        13.9%

        -

        -

        -

        -

        表2

        對于InnoDB引擎,sql-bench測試結果顯示整體上icc編譯的mysql在執行時間上較gcc編譯的mysql沒有優勢,相反還有劣勢。但分析測試過程中的各種SQL,發現基于InnoDB表primary key的更新,查找操作icc編譯的mysql較gcc編譯的mysql還是有優勢的。但是對于基于InnoDB輔助索引的查找和更新,icc編譯的mysql性能不如gcc編譯的mysql。這應該和InnoDB數據存儲方式聚簇索引相關,基于primary key的操作直接可以定位需要的數據;但是基于輔助索引的操作,則需要輔助索引和primary key兩次才能定位,這中間是大量的隨機讀,增加IO負載。

        對于MyISAM引擎,不存在上述問題,所有索引中直接存放著數據行的物理位置。從sql-bench測試結果上看,icc編譯的mysql優勢明顯,整體在執行時間上減少了13.9%。同時從測試中每個階段上來看,在insert,select階段,icc較gcc分別減少13.8%,26.1%。

        在對于InnoDB和MyISAM測試過程中,統計系統cpu信息和相關進程占用內存的信息。Icc編譯的mysql在cpu開銷上和gcc編譯的mysql相差不多;內存使用上icc版mysql較gcc版要少。通過iostat觀察磁盤利用率絕大部分時間里保持在5%以下,而cpu的user使用率在20%以上。尤其是在MyISAM測試過程中insert和select測試階段,磁盤利用率大部分時間保持在3%以下。通過這些數據可以看出CPU相關的計算操作是這個測試中較主要的方面,而IO負載對測試結果影響較少。

        通過這個測試,可以看出icc編譯的mysql對于MyISAM引擎優化效果明顯;對于InnoDB基于primary key的操作有優化效果。但是對于InnoDB基于輔助索引的操作,icc編譯的mysql存在劣勢。同時,在IO負載不大,CPU負載相對較大的環境中,icc可以發揮優勢。

        4.2 使用mysqlslap的測試結果及分析

        4.2.1 使用某數據庫數據,InnoDB引擎測試結果及分析

        4.2.1.1 對于全腳本回放測試結果比較及分析

        整個腳本中的SQL均是InnoDB引擎的。從整個腳本回放測試的結果比較來看,icc編譯出的mysql并沒有顯現出優勢,執行時間上比gcc編譯出的mysql慢。


        全腳本測試

        執行時間

        Concurrency=1

        Concurrency=10

        Concurrency=20

        Icc編譯的mysql

        230.34s

        736.70s

        1614.49s

        Gcc編譯的mysql

        197.34s

        623.70s

        1334.76s

        Icc較gcc的優勢

        -16.7%

        -18.1%

        -21.0%

        表3

        全腳本測試

        Concurrency=1

        Concurrency=10

        Concurrency=20

        Cpu%

        Mem%

        Cpu%

        Mem%

        Cpu%

        Mem%

        us

        sy

        Id

        Us

        sy

        Id

        us

        sy

        id

        Icc-mysql

        9.9

        2.0

        71.9

        7.7

        61.7

        9.0

        25.3

        7.5

        66.4

        17.2

        15.1

        7.5

        Gcc-mysql

        10.1

        1.2

        72.6

        10.7

        60.6

        3.1

        30.3

        11.3

        80.1

        7.2

        10.6

        11.5

        表4

        表4是icc編譯的mysql和gcc編譯的mysql在測試過程中資源使用情況的對比。從表中數據可以看出,icc編譯的mysql在cpu,內存開銷上較gcc編譯的mysql要小。同時需要注意的是在cpu花在系統kernel內的時間上,icc編譯的mysql明顯多于gcc編譯的mysql。懷疑底層系統由gcc編譯和上層icc編譯的應用程序配合有問題。在全腳本測試的過程中,通過iostat觀察IO負載情況,發現磁盤利用率大部分時間保持在50%以上,一部分時間會在90%以上。說明這種情況下,IO負載是比較大的。

        4.2.1.2 特定的3個SQL測試結果及分析

        在做完整個全腳本測試比較之后,我分析了腳本中包含的SQL。把它們歸納歸類,然后對每一種類型的SQL進行對比測試。從每種SQL的執行計劃、執行過程來分析該SQL在icc編譯的mysql和gcc編譯的mysql表現出來的不同執行時間。從這些信息分析icc編譯的mysql性能具有優勢的方面。下面對3種具有代表性的SQL的測試結果。

        SQL1:update tst_report_orderinfo_stat t,tst_userposmap_info t1,tst_postree_info t2 set t.posid=t2.posid where t.submitor_id=t1.ucid and t1.posid=t2.posid and t1.dataowner=1 and t2.postype=3 and t.finance_arr_date=t1.stat_date and t2.stat_date=t1.stat_date ;

        SQL1

        執行時間

        Concurrency=1

        Concurrency=5

        Concurrency=10

        Icc編譯的mysql

        35.06s

        95.05s

        168.87s

        Gcc編譯的mysql

        34.59s

        100.18s

        179.13s

        Icc較gcc的優勢

        -1%

        5.1%

        5.7%

        表5

        將上述SQL稍微改造一下,以獲得該SQL的執行計劃(該執行計劃和上面update操作相似):

        select t.posid,t2.posid from tst_report_orderinfo_stat t,tst_userposmap_info t1,tst_postree_info t2 where t.submitor_id=t1.ucid and t1.posid=t2.posid and t1.dataowner=1 and t2.postype=3 and t.finance_arr_date=t1.stat_date and t2.stat_date=t1.stat_date ;

        獲得的執行計劃:

        *************************** 1. row ***************************

        id: 1

        select_type: SIMPLE

        table: t1

        type: ALL

        possible_keys: PRIMARY,tst_userposmap_info_stat_date_idx

        key: NULL

        key_len: NULL

        ref: NULL

        rows: 1157224

        Extra: Using where

        *************************** 2. row ***************************

        id: 1

        select_type: SIMPLE

        table: t2

        type: eq_ref

        possible_keys: PRIMARY,tst_postree_info_stat_date_idx

        key: PRIMARY

        key_len: 7

        ref: xxx.t1.posid,xxx.t1.stat_date

        rows: 1

        Extra: Using where

        *************************** 3. row ***************************

        id: 1

        select_type: SIMPLE

        table: t

        type: ref

        possible_keys: index_report_finance_arr_date_idx,index_report_submiter_id

        key: index_report_submiter_id

        key_len: 4

        ref: xxx.t1.ucid

        rows: 16

        Extra: Using where

        3 rows in set (0.00 sec)

        從執行計劃上可以看出,驅動表采取的全表掃描的方式取得數據,而不是通過索引。即使是Innodb也要加表鎖,所以在增加concurrency后,mysql也只能串行處理這些請求。這樣在第一次執行該SQL時需要從磁盤上取得相關數據,而在第一次以后再執行該SQL時,就不需要從磁盤上取得數據(數據會被緩存)。后續的SQL執行消耗的是CPU資源,從測試結果來看,icc編譯的mysql在concurrency=1沒有優勢;但是在concurrency>1后,逐漸顯現出優勢,并且優勢隨著concurrency增加而增加??梢钥闯鰅cc編譯出的mysql在CPU運算方面的優勢。

        SQL2:select blacklist_id, company_name from td_blacklist where company_name like '%xxx%' and del_flag= 0;


        SQL2

        執行時間

        Concurrency=10

        Concurrency=50

        Concurrency=100

        Icc編譯的mysql

        0.228s

        0.265s

        0.337s

        Gcc編譯的mysql

        0.227s

        0.287s

        0.365s

        Icc較gcc的提升

        -0.4%

        8%

        8%

        表6

        本SQL的執行計劃為:

        *************************** 1. row ***************************

        id: 1

        select_type: SIMPLE

        table: td_blacklist

        type: ALL

        possible_keys: NULL

        key: NULL

        key_len: NULL

        ref: NULL

        rows: 1589

        Extra: Using where

        從上述執行計劃可以看出該操作使用全表掃描過濾數據,這種方式是順序讀操作,并且涉及的行數只有1589行。IO操作的壓力不大,這要消耗應是CPU相關操作。從本條SQL的測試結果上看,在InnoDB引擎下,對于全表掃描的操作,icc編譯的mysql較gcc編譯的mysql沒有劣勢;在高并發下,icc編譯的mysql還有優勢。

        SQL3:update tb_cust_app tc left join (select count(distinct f.cust_id) num, follow_id from tb_follow_assign f, tb_customer c where f.cust_id=c.cust_id and c.cust_stat_1<>5 group by follow_id) tf on tc.user_id = tf.follow_id set tc.ownered_size=ifnull(tf.num,0) ;

        SQL3

        執行時間

        Concurrency=1

        Concurrency=10

        Concurrency=50

        Icc編譯的mysql

        52.30s

        79.37s

        557.23s

        Gcc編譯的mysql

        50.81s

        77.30s

        452.49s

        Icc較gcc的提升

        -3%

        -2.7%

        -23.1%

        表7

        將上述SQL稍微改造一下,以獲得該SQL的執行計劃:

        select tc.ownered_size,ifnull(tf.num,0) from tb_cust_app tc left join (select count(distinct f.cust_id) num, follow_id from tb_follow_assignf, tb_customer c where f.cust_id=c.cust_id and c.cust_stat_1<>5 group by follow_id) tf on tc.user_id = tf.follow_id;

        相關的執行計劃:

        *************************** 1. row ***************************

        id: 1

        select_type: PRIMARY

        table: tc

        type: ALL

        possible_keys: NULL

        key: NULL

        key_len: NULL

        ref: NULL

        rows: 4386

        Extra:

        *************************** 2. row ***************************

        id: 1

        select_type: PRIMARY

        table:

        type: ALL

        possible_keys: NULL

        key: NULL

        key_len: NULL

        ref: NULL

        rows: 2655

        Extra:

        *************************** 3. row ***************************

        id: 2

        select_type: DERIVED

        table: f

        type: index

        possible_keys: Index_follow_assign_cust_id

        key: Index_follow_assign_follow_id

        key_len: 5

        ref: NULL

        rows: 362615

        Extra:

        *************************** 4. row ***************************

        id: 2

        select_type: DERIVED

        table: c

        type: eq_ref

        possible_keys: PRIMARY

        key: PRIMARY

        key_len: 4

        ref: xxx.f.cust_id

        rows: 1

        Extra: Using where

        4 rows in set (3.00 sec)

        從上述執行計劃可以看出,table f是按照索引順序進行全表的索引樹掃描,這就會造成很多的隨機讀(使用的索引不是primary key)。大量的隨機讀會造成比較大的IO壓力。從測試結果上看,icc編譯出的mysql與gcc編譯出的mysql相比,在執行時間存在一定的劣勢。前面的全腳本測試中存在比較多的這種SQL,因此全腳本回放測試中icc編譯出的mysql執行時間上比gcc編譯的mysql多。從本條SQL的執行計劃和測試結果上看,在InooDB引擎下,使用輔助索引,icc編譯出的mysql很可能出現劣勢,這和sql-bench測試結果一致。

        4.2.2 使用某數據庫數據,MyISAM引擎測試結果及分析

        本節將數據庫中一些表的存儲引擎改成了MyISAM,測試使用的SQL依然來自使用的SQL。本節希望獲得在MyISAM引擎基礎上,基于某數據庫數據,icc編譯的mysql對一些典型SQL的優化效果。

        SQL1:(select customerd, customername, companyname, realcompanyname from tb_shifen_customerwhere urldomain like "%.cn" and status=3 and accountm>0 limit 10) union (select customerd, customername, companyname, realcompanyname from tb_shifen_customer where urldomain like "%.cn" and status in (1,4,6) and status=3 and accountm<=0 and invalidate>=date_sub(curdate(),interval ? day) limit 10) union (select customerd, customername, companyname, realcompanyname from tb_shifen_customer where urldomain like "%.cn" and status in (1,4,6) and accountm>0 limit 10) union (select customerd, customername, companyname, realcompanyname from tb_shifen_customer where urldomain like "%.cn" and status=2 limit 10);

        SQL1

        執行時間

        Concurrency=1

        Concurrency=10

        Concurrency=100

        Icc編譯的mysql

        36.01s

        31.20s

        162.78s

        Gcc編譯的mysql

        41.02s

        40.30s

        181.83s

        Icc較gcc的提升

        12.6%

        22.0%

        10.5%

        表8

        SQL2:select count(*) from tb_customer where urldomain like "%.cn";

        SQL2

        執行時間

        Concurrency=1

        Concurrency=10

        Concurrency=100

        Icc編譯的mysql

        0.014s

        0.014s

        0.029s

        Gcc編譯的mysql

        0.026s

        0.027s

        0.035s

        Icc較gcc的提升

        41.2%

        48.1%

        17.1%

        表9

        SQL3:select cust.cust_id,cust.cust_stat_1,cust.cust_stat_2,cust.cust_name, cust.cust_branch_name,cust.cust_input_type,cust.add_time,cust.cust_follow_num, cust.cust_trade_1,cust.cust_trade_2,dis.distribute_time from tb_customer cust left join tb_cust_distribute dis on cust.cust_id=dis.cust_id and dis.state=1 where cust.cust_id>0 and cust.cust_stat_1 in(8) and cust.pose_id=157 order by cust.cust_id desc limit 1170 , 15;


        SQL2

        執行時間

        Concurrency=1

        Concurrency=10

        Concurrency=100

        Icc編譯的mysql

        2.839s

        3.631s

        9.554s

        Gcc編譯的mysql

        2.828s

        3.740s

        10.867s

        Icc較gcc的提升

        -0.3%

        2.91%

        12.1%

        表10

        上述3個類型的SQL是從測試庫上執行的讀操作中挑選出來的,相應的表的引擎改成了MyISAM引擎。這3個SQL涉及了掃表,索引掃描,排序等操作。從測試的結果上看,icc編譯的mysql對MyISAM引擎讀操作的優化效果明顯。從執行時間上看(Qphotoshop/ target=_blank class=infotextkey>PS)減少大概在10%-20%之間(Qphotoshop/ target=_blank class=infotextkey>PS增加10%-20%)。

        SQL4:update tb_cust_app tc left join (select count(distinct f.cust_id) num, follow_id from tb_follow_assignf, tb_customer c where f.cust_id=c.cust_id and c.cust_stat_1<>5 group by follow_id) tf on tc.user_id = tf.follow_id set tc.ownered_size=ifnull(tf.num,0) ;

        SQL2

        執行時間

        Concurrency=1

        Concurrency=10

        Concurrency=100

        Icc編譯的mysql

        31.279s

        42.290s

        342.80s

        Gcc編譯的mysql

        33.274s

        53.731s

        566.374s

        Icc較gcc的提升

        6.0%

        21.23%

        39.5%

        表11

        SQL4同上一節的SQL3。在上一節InnoDB引擎下,icc編譯的mysql對于此SQL在執行時間上明顯慢于gcc編譯的mysql,也主要是因為該SQL導致innodb全腳本測試icc編譯的mysql慢于gcc編譯的mysql。但是對于MyISAM引擎,從測試結果上看,icc編譯的mysql明顯優于gcc編譯的mysql。從測試可以看出icc編譯的mysql對MyISAM寫操作也有優化效果,從執行時間上看(Qphotoshop/ target=_blank class=infotextkey>PS)減少大概在10%-20%之間(Qphotoshop/ target=_blank class=infotextkey>PS增加10%-20%)。

        5 測試結論

        從兩個維度上總結測試結論:1存儲引擎維度;2CPU,IO負載。

        從存儲引擎維度:對于MyISAM引擎,從sql-bench,mysqlslap使用某數據庫數據測試結果上看,icc編譯的mysql無論從讀操作還是寫操作都有優化效果,SQL執行時間平均減少10%-20%。對于一些比較消耗CPU的SQL(比如排序等,執行時間較長的SQL),在一定的并發下優化效果更明顯。

        對于InnoDB引擎,從sql-bench,mysqlslap使用全腳本測試結果上看,icc編譯的mysql較gcc編譯的mysql從Qphotoshop/ target=_blank class=infotextkey>PS(SQL執行時間)沒有優勢,甚至是劣勢。同時從sql-bench,全腳本中的逐個SQL分析來看:對于利用primary key或者全表掃描的SQL,icc編譯的mysql有一些優化效果;對于利用輔助索引的SQL,icc編譯的mysql在執行時間上比gcc編譯的mysql慢。分析原因,InnoDB使用聚簇索引存儲數據,利用輔助索引時,還需要走一遍primary key,這中間會有比較多的隨機讀等操作。

        從IO,CPU負載維度:通過測試中對于資源的統計和對比,icc編譯的mysql在用戶態cpu開銷上較gcc編譯的mysql小(相差不大);在內核態cpu開銷要比gcc編譯的mysql多;在內存上開銷上icc編譯的mysql稍小。Icc對于CPU密集,IO負載不重的場景,優化效果明顯;對于IO負載較重的場景,icc編譯的mysql優化效果可能不明顯。

        綜上所述:icc編譯的mysql用于MyISAM引擎,較gcc編譯的mysql優化效果明顯。對于InnoDB引擎,使用輔助索引等操作,icc編譯的mysql比gcc編譯的mysql在執行時間上要慢,存在劣勢。對于使用全表掃描、primary key的InnoDB操作,在低并發下,icc編譯的mysql在執行時間上不會慢,在高并發下icc編譯的mysql具有優勢。同時業務類型是CPU密集型,而不是IO密集型,有助于發揮icc編譯器的優化效果。

        bitsCN.com

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Icc編譯MySQL性能調研_MySQL

        Icc編譯MySQL性能調研_MySQL:bitsCN.com 傳統的c/c++編譯器為GNU的gcc/g++,當然我們也通常使用gcc/g++來編譯MySQL。但是有研究指出gcc/g++編譯器對c/c++優化在某些方面做的并不好。Intel針對自己的處理器特點發布了編譯器icc。本文希望使用icc編譯得到MySQL,然后通過測試得到i
        推薦度:
        標簽: 處理器 傳統 mysql
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产成AV人天堂无码| 日韩欧美亚洲国产精品字幕久久久| 免费国产va视频永久在线观看| 日韩免费高清视频网站| 亚洲精品国产综合久久久久紧| 啦啦啦中文在线观看电视剧免费版 | 久久国产乱子伦免费精品| 亚洲av最新在线网址| 久久亚洲精品人成综合网| 久久中文字幕免费视频| 亚洲视频在线一区| 亚洲精品国产免费| 2020年亚洲天天爽天天噜| 久久不见久久见中文字幕免费| 亚洲精品伊人久久久久| 男女啪啪永久免费观看网站| 日韩成人毛片高清视频免费看| AV在线亚洲男人的天堂| AAA日本高清在线播放免费观看| 久久亚洲精品成人777大小说| 4hu四虎最新免费地址| 亚洲AV无码成人精品区狼人影院| 国产精品jizz在线观看免费| 人人公开免费超级碰碰碰视频 | 日韩在线天堂免费观看| 国产亚洲精品美女久久久久 | 国产精品爱啪在线线免费观看| 亚洲一区二区三区免费视频| 日韩免费观看视频| 成人免费无码H在线观看不卡| 亚洲高清国产拍精品26U| 日韩免费精品视频| 美女黄频免费网站| 亚洲一区二区影院| 国产日产成人免费视频在线观看| 国产午夜精品理论片免费观看| 亚洲欧洲自拍拍偷午夜色| 国产一级大片免费看| 久久精品成人免费观看| 亚洲中文无码mv| 亚洲精品无码精品mV在线观看|