一、什么情況下mysql innodb會發(fā)生回表操作
比如說你建立了一個(gè)A,B聯(lián)合索引,你的sql語句是 select A,B from table where A=xxx, B=xxx你會發(fā)現(xiàn)你想要搜索的A,B從索引數(shù)據(jù)中已經(jīng)存在了,壓根不用拿到id到表數(shù)據(jù)中去查找,此時(shí)便不會回表,這種現(xiàn)象就叫做索引覆蓋。
現(xiàn)在你把語句改為了 select A,B,C from table where A=xxx, B=xxx,C畢竟不在索引數(shù)據(jù)中,拿不到,那只能先拿到id再導(dǎo)表數(shù)據(jù)文件中搜索,此時(shí)就是回表
避免回表:
用主鍵搜索只查詢被聯(lián)合索引覆蓋的字段MySQL innodb的主鍵索引是簇集索引,也就是索引的葉子節(jié)點(diǎn)存的是整個(gè)單條記錄的所有字段值,不是主鍵索引的就是非簇集索引,非簇集索引的葉子節(jié)點(diǎn)存的是主鍵字段的值?;乇硎鞘裁匆馑??就是你執(zhí)行一條sql語句,需要從兩個(gè)b+索引中去取數(shù)據(jù)。舉個(gè)例子:
表tbl有a,b,c三個(gè)字段,其中a是主鍵,b上建了索引,然后編寫sql語句
SELECT * FROM tbl WHERE a=1
這樣不會產(chǎn)生回表,因?yàn)樗械臄?shù)據(jù)在a的索引樹中均能找到
SELECT * FROM tbl WHERE b=1
這樣就會產(chǎn)生回表,因?yàn)閣here條件是b字段,那么會去b的索引樹里查找數(shù)據(jù),但b的索引里面只有a,b兩個(gè)字段的值,沒有c,那么這個(gè)查詢?yōu)榱巳〉絚字段,就要取出主鍵a的值,然后去a的索引樹去找c字段的數(shù)據(jù)。查了兩個(gè)索引樹,這就叫回表。
索引覆蓋就是查這個(gè)索引能查到你所需要的所有數(shù)據(jù),不需要去另外的數(shù)據(jù)結(jié)構(gòu)去查。其實(shí)就是不用回表。
怎么避免?不是必須的字段就不要出現(xiàn)在SELECT里面。或者b,c建聯(lián)合索引。但具體情況要具體分析,索引字段多了,存儲和插入數(shù)據(jù)時(shí)的消耗會更大。這是個(gè)平衡問題。
延伸閱讀:
二、Power BI是什么
Power BI(power business intelligence)是軟件服務(wù)、應(yīng)用和連接器的集合,它們協(xié)同工作以將相關(guān)數(shù)據(jù)來源轉(zhuǎn)換為連貫的視覺逼真的交互式見解。 無論用戶的數(shù)據(jù)是簡單的 Excel 電子表格,還是基于云和本地混合數(shù)據(jù)倉庫的集合,Power BI 都可讓用戶輕松地連接到數(shù)據(jù)源,直觀看到(或發(fā)現(xiàn))重要內(nèi)容,與任何所希望的人進(jìn)行共享。
Power BI 簡單且快速,能夠從 Excel 電子表格或本地?cái)?shù)據(jù)庫創(chuàng)建快速見解。 同時(shí) Power BI 也可進(jìn)行豐富的建模和實(shí)時(shí)分析,及自定義開發(fā)。 因此它既是用戶的個(gè)人報(bào)表和可視化工具,還可用作組項(xiàng)目、部門或整個(gè)企業(yè)背后的分析和決策引擎。