MySQL面试题 | 附答案解析(五)
- 創建索引時需要注意什么?
(1)非空字段:應該指定列為NOT NULL,除非你想存儲NULL。在mysql中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計信息以及比較運算更加復雜。你應該用0、一個特殊的值或者一個空串代替空值;
(2)取值離散大的字段:(變量各個取值之間的差異程度)的列放到聯合索引的前面,可以通過count()函數查看字段的差異值,返回值越大說明字段的唯一值越多字段的離散程度高;
(3)索引字段越小越好:數據庫的數據存儲以頁為單位一頁存儲的數據越多一次IO操作獲取的數據越大效率越高。
- 使用索引查詢一定能提高查詢的性能嗎?為什么通常,通過索引查詢數據比全表掃描要快。但是我們也必須注意到它的代價。
(1)索引需要空間來存儲,也需要定期維護, 每當有記錄在表中增減或索引列被修改時,索引本身也會被修改。這意味著每條記錄的INSERT,DELETE,UPDATE將為此多付出4,5 次的磁盤I/O。因為索引需要額外的存儲空間和處理,那些不必要的索引反而會使查詢反應時間變慢。使用索引查詢不一定能提高查詢性能,索引范圍查詢(INDEX RANGE SCAN)適用于兩種情況:
(2)基于一個范圍的檢索,一般查詢返回結果集小于表中記錄數的30%
(3)基于非唯一性索引的檢索
- 百萬級別或以上的數據如何刪除關于索引:由于索引需要額外的維護成本,因為索引文件是單獨存在的文件,所以當我們對數據的增加,修改,刪除,都會產生額外的對索引文件的操作,這些操作需要消耗額外的IO,會降低增/改/刪的執行效率。所以,在我們刪除數據庫百萬級別數據的時候,查詢MySQL官方手冊得知刪除數據的速度和創建的索引數量是成正比的。
(1)所以我們想要刪除百萬數據的時候可以先刪除索引(此時大概耗時三分多鐘)
(2)然后刪除其中無用數據(此過程需要不到兩分鐘)
(3)刪除完成后重新創建索引(此時數據較少了)創建索引也非常快,約十分鐘左右。
(4)與之前的直接刪除絕對是要快速很多,更別說萬一刪除中斷,一切刪除會回滾。那更是坑了。
-
前綴索引語法:index(field(10)),使用字段值的前10個字符建立索引,默認是使用字段的全部內容建立索引。前提:前綴的標識度高。比如密碼就適合建立前綴索引,因為密碼幾乎各不相同。實操的難度:在于前綴截取的長度。我們可以利用select count(*)/count(distinct left(password,prefixLen));,通過從調整prefixLen的值(從1自增)查看不同前綴長度的一個平均匹配度,接近1時就可以了(表示一個密碼的前prefixLen個字符幾乎能確定唯一一條記錄)
-
什么是最左前綴原則?什么是最左匹配原則
(1)顧名思義,就是最左優先,在創建多列索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊。
(2)最左前綴匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。
(3)=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式
最后,小編分類整理了許多java進階學習材料和BAT面試給熱愛IT行業的你,如果需要資料的請轉發此文章后再私聊小編回復【java】就能領取2019年java進階學習資料和BAT面試題以及《Effective Java》(第3版)電子版書籍。也可以加群:712263501領取海量學習資料進行學習。
總結
以上是生活随笔為你收集整理的MySQL面试题 | 附答案解析(五)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个俩字qq网名!
- 下一篇: MySQL面试题 | 附答案解析(六)