<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【58期】盤點(diǎn)那些面試中最常問的MySQL問題,第一彈!

          共 2141字,需瀏覽 5分鐘

           ·

          2020-10-14 11:48

          程序員的成長(zhǎng)之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 4 分鐘。

          來自:網(wǎng)絡(luò)

          1、MySQL中myisam與innodb的區(qū)別

          MyISAM:
          • 不支持事務(wù),但是每次查詢都是原子的;

          • 支持表級(jí)鎖,即每次操作對(duì)整個(gè)表加鎖;

          • 存儲(chǔ)表的總行數(shù);

          • 一個(gè)MYISAM表有三個(gè)文件:索引文件、表結(jié)構(gòu)文件、數(shù)據(jù)文件;

          • 采用聚集索引,索引文件的數(shù)據(jù)域存儲(chǔ)指向數(shù)據(jù)文件的指針。輔索引與主索引基本一致,但是輔索引不用保證唯一性。

          InnoDb:
          • 支持ACID的事務(wù),支持事務(wù)的四種隔離級(jí)別;

          • 支持行級(jí)鎖及外鍵約束:因此可以支持寫并發(fā);

          • 不存儲(chǔ)總行數(shù);

          • 一個(gè)InnoDb引擎存儲(chǔ)在一個(gè)文件空間(共享表空間,表大小不受操作系統(tǒng)控制,一個(gè)表可能分布在多個(gè)文件里),也有可能為多個(gè)(設(shè)置為獨(dú)立表空,表大小受操作系統(tǒng)文件大小限制,一般為2G),受操作系統(tǒng)文件大小的限制;

          • 主鍵索引采用聚集索引(索引的數(shù)據(jù)域存儲(chǔ)數(shù)據(jù)文件本身),輔索引的數(shù)據(jù)域存儲(chǔ)主鍵的值;因此從輔索引查找數(shù)據(jù),需要先通過輔索引找到主鍵值,再訪問輔索引;最好使用自增主鍵,防止插入數(shù)據(jù)時(shí),為維持B+樹結(jié)構(gòu),文件的大調(diào)整。

          兩者的適用場(chǎng)景:
          因?yàn)镸yISAM相對(duì)簡(jiǎn)單所以在效率上要優(yōu)于InnoDB.如果系統(tǒng)讀多,寫少。對(duì)原子性要求低。那么MyISAM最好的選擇。且MyISAM恢復(fù)速度快??芍苯佑脗浞莞采w恢復(fù)。
          如果系統(tǒng)讀少,寫多的時(shí)候,尤其是并發(fā)寫入高的時(shí)候。InnoDB就是首選了。
          擴(kuò)展問題:myisam與innodb引擎下select count(*)哪個(gè)更快,為什么?
          知道的童鞋,歡迎留言說出正確答案~

          2、MySQL INT和CHAR隱式類型轉(zhuǎn)換需要注意什么?

          主要需要記住下面兩點(diǎn):
          1、當(dāng)查詢字段是INT類型,如果查詢條件為CHAR,將查詢條件轉(zhuǎn)換為INT,如果是字符串前導(dǎo)都是數(shù)字,將截取前導(dǎo)數(shù)字用來比較,如果沒有前導(dǎo)數(shù)字,則轉(zhuǎn)換為0。
          2.、當(dāng)查詢字段是CHAR/VARCHAR類型,如果查詢條件為INT,將查詢字段轉(zhuǎn)換為INT再進(jìn)行比較,可能會(huì)造成全表掃描。
          答案解析
          有如下一張測(cè)試表product,id為int類型,name為varchar類型。
          +----+----------+
          |?id?|?name???|
          +----+----------+
          |
          ??1?|?apple???|
          |??2?|?banana?|
          |
          ??3?|?99cat???|
          +----+----------+
          情況1:
          //?查詢條件轉(zhuǎn)化為數(shù)字1再比較
          mysql>?select?*?from?product?where?id?=?'1abc23';
          +----+---------+
          |?id?|?name??|
          +----+---------+
          |??1?|?apple??|
          +----+---------+
          情況2:
          //?查詢字段全部轉(zhuǎn)化成數(shù)字,id:1和id:2字段值轉(zhuǎn)化為0,id:3轉(zhuǎn)化成99,再比較
          mysql>?select?*?from?product?where?name=0;
          +----+----------+
          |?id?|?name???|
          +----+----------+
          |??1?|?apple???|
          |??2?|?banana?|
          +----+----------+

          3、MySQL 如何高效率隨機(jī)獲取N條數(shù)據(jù)?

          假設(shè)表叫做mm_account。
          ID連續(xù)的情況下(注意不能帶where,否則結(jié)果不好):
          SELECT?*
          FROM?`mm_account`?AS?t1?JOIN?(SELECT?ROUND(RAND()?*?(SELECT?MAX(id)?FROM?`mm_account`))?AS?id)?AS?t2
          WHERE?t1.id?>=?t2.id
          ORDER?BY?t1.id?ASC?LIMIT?4;
          ID不連續(xù)的情況下:
          SELECT?*?FROM?`mm_account`?
          WHERE?id?>=?(SELECT?floor(RAND()?*?(SELECT?MAX(id)?FROM?`mm_account`)))??and?city="city_91"?and?showSex=1
          ORDER?BY?id?LIMIT?4;
          如果有一個(gè)字段叫id,最快的方法如下(隨機(jī)獲取5條):
          SELECT?*?FROM?mm_account?
          WHERE?id?>=?((SELECT?MAX(id)?FROM?mm_account)-(SELECT?MIN(id)?FROM?mm_account))?*?RAND()?+?(SELECT?MIN(id)?FROM?mm_account)
          limit?5;
          如果帶where語句,上面就不適合了,帶where語句請(qǐng)看下面:
          SELECT?*
          FROM?`mm_account`?AS?t1?JOIN?(SELECT?ROUND(RAND()?*?(
          (SELECT?MAX(id)?FROM?`mm_account`?where?id<1000?)-(SELECT?MIN(id)?FROM?`mm_account`?where?id<1000?))+(SELECT?MIN(id)?FROM?`mm_account`?where?id<1000?))?AS?id)?AS?t2
          WHERE?t1.id?>=?t2.id
          ORDER?BY?t1.id?LIMIT?5;

          4、說說你知道的MySQL的索引類型,并分別簡(jiǎn)述一下各自的場(chǎng)景。

          普通索引:沒有任何限制條件的索引,該索引可以在任何數(shù)據(jù)類型中創(chuàng)建。
          唯一索引:使用UNIQUE參數(shù)可以設(shè)置唯一索引。創(chuàng)建該索引時(shí),索引列的值必須唯一,但允許有空值。通過唯一索引,用戶可以快速地定位某條記錄,主鍵索引是一種特殊的唯一索引。
          全文索引:僅可用于 MyISAM 表,針對(duì)較大的數(shù)據(jù),生成全文索引耗時(shí)耗空間。
          空間索引:只能建立在空間數(shù)據(jù)類型上。這樣可以提高系統(tǒng)獲取空間數(shù)據(jù)類型的效率。僅可用于 MyISAM 表,索引的字段不能為空值。使用SPATIAL參數(shù)可以設(shè)置索引為空間索引。
          單列索引:只對(duì)應(yīng)一個(gè)字段的索引。
          多列索引:在表的多個(gè)字段上創(chuàng)建一個(gè)索引。該索引指向創(chuàng)建時(shí)對(duì)應(yīng)的多個(gè)字段,用戶可以通過這幾個(gè)字段進(jìn)行查詢,想使用該索引,用戶必須使用這些字段中的一個(gè)字段。
          擴(kuò)展問題:MySQL索引是如何提高查詢效率的呢?
          可以留言各抒己見,下期專門分析這個(gè)問題。

          推薦閱讀:

          【57期】面試官問,MySQL建索引需要遵循哪些原則呢?

          【56期】你說你熟悉并發(fā)編程,那么你說說Java鎖有哪些種類,以及區(qū)別

          【55期】面試中經(jīng)常被問到Java引用類型原理,帶你深入剖析

          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號(hào)內(nèi)回復(fù)「2048」,即可免費(fèi)獲?。?!

          微信掃描二維碼,關(guān)注我的公眾號(hào)

          朕已閱?

          瀏覽 54
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品久久久久永久免费看 | 日产精品一区二区乱码视频 | 日韩色道 | 色婷婷啪啪啪 | 麻豆AV在线播放 |