国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MSQL系列(十二) Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動表上

這篇具有很好參考價(jià)值的文章主要介紹了MSQL系列(十二) Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動表上。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動表上

前面我們講解了B+Tree的索引結(jié)構(gòu),也詳細(xì)講解下 left Join的底層驅(qū)動表 選擇原理,那么今天我們來看看到底如何用以及如何建立索引和索引優(yōu)化

開始之前我們先提一個問題, 為什么索引要建立在被驅(qū)動表上 ?

1.建表及測試數(shù)據(jù)

我們先創(chuàng)建兩個表 test_user 和 test_order 這兩個表作為我們的測試表及測試數(shù)據(jù)

  • test_user 5條數(shù)據(jù), 索引只有主鍵id
  • test_order 5條數(shù)據(jù),索引同樣也只有主鍵id
#創(chuàng)建表 test_user
CREATE TABLE `test_user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `id_card` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '身份證ID',
  `user_name` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用戶名字',
  `age` int DEFAULT NULL COMMENT '年齡',
  PRIMARY KEY (`id`),
  KEY `idx_age` (`age`),
  KEY `idx_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用戶表'
#創(chuàng)建表 test_order
CREATE TABLE `test_order` (
  `id` int NOT NULL AUTO_INCREMENT,
  `order_name` varchar(32) NOT NULL DEFAULT '',
  `user_name` varchar(32) NOT NULL,
  `pay` int NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='訂單表'

插入數(shù)據(jù)

#插入 user 用戶數(shù)據(jù)
INSERT INTO `test`.`test_user` (`id`, `id_card`, `user_name`, `age`) VALUES (1, '11', 'aa', 10);
INSERT INTO `test`.`test_user` (`id`, `id_card`, `user_name`, `age`) VALUES (2, '22', 'bb', 20);
INSERT INTO `test`.`test_user` (`id`, `id_card`, `user_name`, `age`) VALUES (3, '33', 'cc', 30);
INSERT INTO `test`.`test_user` (`id`, `id_card`, `user_name`, `age`) VALUES (4, '44', 'dd', 40);
INSERT INTO `test`.`test_user` (`id`, `id_card`, `user_name`, `age`) VALUES (5, '55', 'ee', 50);

#插入 order 訂單數(shù)據(jù)
INSERT INTO `test`.`test_order` (`id`, `order_name`, `user_name`, `pay`) VALUES (1, '衣服', 'aa', 100);
INSERT INTO `test`.`test_order` (`id`, `order_name`, `user_name`, `pay`) VALUES (2, '鞋子', 'bb', 200);
INSERT INTO `test`.`test_order` (`id`, `order_name`, `user_name`, `pay`) VALUES (3, '電視', 'cc', 300);
INSERT INTO `test`.`test_order` (`id`, `order_name`, `user_name`, `pay`) VALUES (4, '零食', 'cc', 400);
INSERT INTO `test`.`test_order` (`id`, `order_name`, `user_name`, `pay`) VALUES (5, '衣服', 'cc', 500);

查詢結(jié)果
MSQL系列(十二) Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動表上,Mysql實(shí)戰(zhàn),mysql索引優(yōu)化,mysql索引建在哪個表,mysql查詢過程,mysql 索引執(zhí)行查詢過程,mysql索引與被驅(qū)動表

2. 不用連接查詢 笛卡爾積

我們先不用 join語句, 直接查詢2個表,看下效果

#直接查詢2個表
select * from test_user,test_order;

得到的解雇i就是 笛卡爾積

  • user表中的每一條記錄,都與order表的一條記錄形成組合
  • user中有5條數(shù)據(jù),order表中也有5條數(shù)據(jù)
  • user 的 第一條,分別和 order 5條對應(yīng)
  • 從而倆個表連接后就有 5 * 5 =25條記錄

查詢結(jié)果笛卡爾積, 25條結(jié)果
MSQL系列(十二) Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動表上,Mysql實(shí)戰(zhàn),mysql索引優(yōu)化,mysql索引建在哪個表,mysql查詢過程,mysql 索引執(zhí)行查詢過程,mysql索引與被驅(qū)動表

3.帶條件的查詢過程即被驅(qū)動表的查詢過程

上面我們見識到了 如果沒有任何條件,我們連接的2個表會形成笛卡爾積,數(shù)量膨脹很大,所以 我們在連接的時候一般都需要過濾條件,我們加一些條件,看下效果

#帶條件的 笛卡爾積查詢
select * from test_user,test_order where test_user.id > 1 and test_user.id = test_order.id and test_order.pay  >200 ;

執(zhí)行結(jié)果如下, 只有3條
MSQL系列(十二) Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動表上,Mysql實(shí)戰(zhàn),mysql索引優(yōu)化,mysql索引建在哪個表,mysql查詢過程,mysql 索引執(zhí)行查詢過程,mysql索引與被驅(qū)動表

查詢條件如下

  • test_user.id > 1
  • test_user.id = test_order.id
  • test_order.pay > 200
    • 首先 id > 1, 就只剩下 user2,3,4,5
    • 然后test_user.id = test.order.id 這樣子就會把很多笛卡爾積 全部去掉, 只保留 兩個表 id相同的記錄, 還是user的 2,3,4,5
    • 最后還有個 pay>200, 這樣就通過掉了 user=2這一條 pay=200, 只保留 3,4,5
    • 也就是我們要的查詢結(jié)果

我們來分析下執(zhí)行過程

  1. 確定驅(qū)動表,我們先假設(shè) user表是驅(qū)動表,然后分析下執(zhí)行過程
  2. 根據(jù)查詢條件 test_user.id >1 ,如果 id不是主鍵, 而且也沒索引, 那就是全表掃描ALL, 找到4條記錄 user_id = 2,3,4,5
  3. 根據(jù)上面驅(qū)動表的數(shù)據(jù)(前面假設(shè)是 user), 然后從被驅(qū)動表 test_order中尋找匹配的記錄,也就是 user_id =2,3,4,5 和 test_user.id = test_order.id匹配的記錄
  4. 此時開始查詢 test_order,當(dāng)匹配第一條 test_user.id = 2時, 簡化查詢條件 test_user.id = test_order.id 就變成了 test_order.id = 2 并且還剩余 一個查詢條件 test_order.pay > 200
  5. 所以 test_order 的表就變成了單表查詢, 兩個查詢條件 test_order.id = 2 and test_order.pay >200, 執(zhí)行test_order的單表查詢,查詢結(jié)果不滿足,因?yàn)?test_order.id =2 的 pay=200,不pay >200的條件, 本次結(jié)束, 繼續(xù)
  6. 開始下一次 當(dāng) user_id =3時, test_order的單表查詢變成了 test_order.id =3 and test_order.pay > 200,進(jìn)行查詢, 滿足條件,返回結(jié)果
  7. 依次類推,直到 user_id 的記錄3,4,5匹配完畢 ,最終得到 3條記錄
  8. 這就是查詢過程

從上面的過程中,我們可以知道,驅(qū)動表 只訪問了一次
但是被驅(qū)動表 要匹配記錄,需要不停的去查詢,匹配,被動表訪問了很多很多次
所以 這就是為什么要把索引建立在被驅(qū)動表上的原因


至此,我們通過Mysql的執(zhí)行查詢過程,分析了解到了索引要建立在被驅(qū)動表上的原理,這對于我們后期進(jìn)行SQL分析,有著重要的作用文章來源地址http://www.zghlxwxcb.cn/news/detail-721687.html

到了這里,關(guān)于MSQL系列(十二) Mysql實(shí)戰(zhàn)-為什么索引要建立在被驅(qū)動表上的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • mysql的主鍵索引為什么不能null

    這是一個非常奇怪且有趣的問題。可以通過官方文檔進(jìn)行解讀 https://dev.mysql.com/doc/refman/5.7/en/glossary.html A special value in SQL, indicating the absence of data. Any arithmetic operation or equality test involving a NULL value, in turn produces a NULL result. (Thus it is similar to the IEEE floating-point concept of NaN, “not

    2024年02月14日
    瀏覽(27)
  • MySQL為什么采用B+樹作為索引底層數(shù)據(jù)結(jié)構(gòu)?

    MySQL為什么采用B+樹作為索引底層數(shù)據(jù)結(jié)構(gòu)?

    ????????索引就像一本書的目錄,通過索引可以快速找到我們想要找的內(nèi)容。那么什么樣的數(shù)據(jù)結(jié)構(gòu)可以用來實(shí)現(xiàn)索引呢?我們可能會想到:二叉查找樹,平衡搜索樹,或者是B樹等等一系列的數(shù)據(jù)結(jié)構(gòu),那么為什么MySQL最終選擇了B+樹作為索引的數(shù)據(jù)結(jié)構(gòu)呢? ? ? ? ? 要想

    2024年02月16日
    瀏覽(25)
  • MySQL為什么要使用B+樹做索引?MySQL索引存儲模型推演,B+樹在MySQL的落地形式

    MySQL為什么要使用B+樹做索引?MySQL索引存儲模型推演,B+樹在MySQL的落地形式

    user_innodb這張表里有4個字段,id,name,gender,phone。 當(dāng)這張表有500萬條數(shù)據(jù),在沒有索引的name字段上執(zhí)行一條where查詢: 如果name字段上有索引呢?我們在name字段上面創(chuàng)建一個索引,再來執(zhí)行一下查詢: 我們再來執(zhí)行一下select語句。 我們會發(fā)現(xiàn),有索引的查詢和沒有索引的

    2024年02月16日
    瀏覽(31)
  • MySQL 索引為什么使用 B+ 樹,而不使用紅黑樹 / B 樹 ?

    MySQL 索引為什么使用 B+ 樹,而不使用紅黑樹 / B 樹 ?

    首先 B 樹和 B+ 樹 都是多叉搜索樹,然后我們先來觀察一下 B+ 樹和 B 樹的數(shù)據(jù)結(jié)構(gòu): B+ 樹的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn) ?B 樹的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn) 【B+ 樹相較于 B 樹的優(yōu)勢】 1. IO 次數(shù)更少(查詢效率更高) ????????B+ 樹的非葉子節(jié)點(diǎn)不存放實(shí)際的數(shù)據(jù),僅存放索引,因此數(shù)據(jù)量相同的情況

    2024年02月12日
    瀏覽(25)
  • MySQL索引為什么選擇B+樹,而不是二叉樹、紅黑樹、B樹?

    MySQL索引為什么選擇B+樹,而不是二叉樹、紅黑樹、B樹?

    二叉樹是一種二分查找樹,有很好的查找性能,相當(dāng)于二分查找。 二叉樹的非葉子節(jié)值大于左邊子節(jié)點(diǎn)、小于右邊子節(jié)點(diǎn)。 原因: 但是當(dāng)N比較大的時候,樹的深度比較高。數(shù)據(jù)查詢的時間主要依賴于磁盤IO的次數(shù),二叉樹深度越大,查找的次數(shù)越多,性能越差。 最壞的情況

    2024年04月25日
    瀏覽(31)
  • MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化

    MSQL系列(六) Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化

    Mysql實(shí)戰(zhàn)-SQL語句優(yōu)化 前面我們講解了索引的存儲結(jié)構(gòu),B+Tree的索引結(jié)構(gòu),以及索引最左側(cè)匹配原則,Explain的用法,可以看到是否使用了索引,今天我們講解一下SQL語句的優(yōu)化及如何優(yōu)化 1.表結(jié)構(gòu) 新建表結(jié)構(gòu) user, user_info id 主鍵id列 id_card 身份證id user_name 用戶姓名 age 年齡

    2024年02月07日
    瀏覽(22)
  • MSQL系列(九) Mysql實(shí)戰(zhàn)-Join算法底層原理

    MSQL系列(九) Mysql實(shí)戰(zhàn)-Join算法底層原理

    Mysql實(shí)戰(zhàn)-Join算法底層原理 前面我們講解了B+Tree的索引結(jié)構(gòu),及Mysql的存儲引擎MyISAM和InnoDB,今天我們來詳細(xì)講解下Mysql的查詢連接Join的算法原理 Join算法分類 在Mysql的查詢過程中,我們都知道涉及多表查詢,我們都會使用join來連接多個表進(jìn)行查詢,join的本質(zhì)就是循環(huán)每個表進(jìn)

    2024年02月08日
    瀏覽(29)
  • 為什么hive表不經(jīng)常用索引

    Hive 表不經(jīng)常使用索引的主要原因是由于其設(shè)計(jì)初衷和使用場景的特點(diǎn)。下面是一些可能的解釋: Hive 主要用于處理大規(guī)模數(shù)據(jù)集的批量分析任務(wù),而不是對單個記錄的實(shí)時查詢。對于批處理任務(wù),全表掃描通常是更為高效的方式,因?yàn)樗饕枰S護(hù)額外的數(shù)據(jù)結(jié)構(gòu)并帶來一

    2024年02月16日
    瀏覽(23)
  • Elasticsearch:索引狀態(tài)是紅色還是黃色?為什么?

    Elasticsearch:索引狀態(tài)是紅色還是黃色?為什么?

    在我之前文章 “Elasticsearch:如何調(diào)試集群狀態(tài) - 定位錯誤信息” 中,我有詳細(xì)介紹如何調(diào)試集群狀態(tài)。在今天的文章中,我將詳細(xì)介紹如何故障排除和修復(fù)索引狀態(tài)。 Elasticsearch 是一個偉大而強(qiáng)大的系統(tǒng),特別是創(chuàng)建一個可擴(kuò)展性極強(qiáng)的分布式數(shù)據(jù)存儲,并自動跟蹤、管理

    2023年04月09日
    瀏覽(25)
  • Pycharm這個更新索引是個什么操作,為什么每次啟動,都會進(jìn)行?

    Pycharm這個更新索引是個什么操作,為什么每次啟動,都會進(jìn)行?

    點(diǎn)擊上方“ Python爬蟲與數(shù)據(jù)挖掘 ”,進(jìn)行關(guān)注 回復(fù)“ 書籍 ”即可獲贈Python從入門到進(jìn)階共10本電子書 今 日 雞 湯 九重城闕煙塵生,千乘萬騎西南行。 大家好,我是皮皮。 一、前言 前幾天在Python最強(qiáng)王者交流群【吳超建】問了一個 Pycharm 操作的問題,這里拿出來給大家分

    2024年02月01日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包