MySQL查漏補缺
- 2019 年 12 月 20 日
- 筆記
.example_responsive_1 { width: 200px; height: 50px; } @media(min-width: 290px) { .example_responsive_1 { width: 270px; height: 50px; } } @media(min-width: 370px) { .example_responsive_1 { width: 339px; height: 50px; } } @media(min-width: 500px) { .example_responsive_1 { width: 468px; height: 50px; } } @media(min-width: 720px) { .example_responsive_1 { width: 655px; height: 50px; } } @media(min-width: 800px) { .example_responsive_1 { width: 728px; height: 50px; } } (adsbygoogle = window.adsbygoogle || []).push({});
MySQL查漏補缺
目錄
十個MySQL知識點(面試題), 查漏補缺, 共同學習, 歡迎交流. 文章地址: https://blog.piaoruiqing.com/2019/12/08/mysql-knowledge-point/
唯一索引比普通索引快嗎, 為什麼
唯一索引不一定比普通索引快, 還可能慢.
- 查詢時, 在未使用
limit 1
的情況下, 在匹配到一條數據後, 唯一索引即返回, 普通索引會繼續匹配下一條數據, 發現不匹配後返回. 如此看來唯一索引少了一次匹配, 但實際上這個消耗微乎其微. - 更新時, 這個情況就比較複雜了. 普通索引將記錄放到
change buffer
中語句就執行完畢了. 而對唯一索引而言, 它必須要校驗唯一性, 因此, 必須將數據頁讀入內存確定沒有衝突, 然後才能繼續操作. 對於寫多讀少的情況, 普通索引利用change buffer
有效減少了對磁盤的訪問次數, 因此普通索引性能要高於唯一索引.
MySQL由哪些部分組成, 分別用來做什麼
- Server
- 連接器: 管理連接, 權限驗證.
- 分析器: 詞法分析, 語法分析.
- 優化器: 執行計劃生成, 索引的選擇.
- 執行器: 操作存儲引擎, 返回執行結果.
- 存儲引擎: 存儲數據, 提供讀寫接口.
MySQL查詢緩存有什麼弊端, 應該什麼情況下使用, 8.0版本對查詢緩存有什麼變更.
- 查詢緩存可能會失效非常頻繁, 對於一個表, 只要有更新, 該表的全部查詢緩存都會被清空. 因此對於頻繁更新的表來說, 查詢緩存不一定能起到正面效果.
- 對於讀遠多於寫的表可以考慮使用查詢緩存.
- 8.0版本的查詢緩存功能被刪了 ( ̄. ̄).
MyISAM和InnoDB的區別有哪些
- InnoDB支持事務, MyISAM不支持.
- InnoDB支持行級鎖, MyISAM支持表級鎖.
- InnoDB支持多版本並發控制(MVVC), MyISAM不支持.
- InnoDB支持外鍵, MyISAM不支持.
- MyISAM支持全文索引, InnoDB不支持(但可以使用Sphinx插件)
MySQL怎麼恢復半個月前的數據
通過整庫備份+binlog進行恢復. 前提是要有定期整庫備份且保存了binlog日誌.
MySQL事務的隔離級別, 分別有什麼特點
- 讀未提交(RU): 一個事務還沒提交時, 它做的變更就能被別的事務看到.
- 讀提交(RC): 一個事務提交之後, 它做的變更才會被其他事務看到.
- 可重複讀(RR): 一個事務執行過程中看到的數據, 總是跟這個事務在啟動時看到的數據是一致的. 當然在可重複讀隔離級別下, 未提交變更對其他事務也是不可見的.
- 串行化(S): 對於同一行記錄, 讀寫都會加鎖. 當出現讀寫鎖衝突的時候, 後訪問的事務必須等前一個事務執行完成才能繼續執行.
做過哪些MySQL索引相關優化
- 盡量使用主鍵查詢: 聚簇索引上存儲了全部數據, 相比普通索引查詢, 減少了回表的消耗.
- MySQL5.6之後引入了索引下推優化, 通過適當的使用聯合索引, 減少回表判斷的消耗.
- 若頻繁查詢某一列數據, 可以考慮利用覆蓋索引避免回表.
- 聯合索引將高頻字段放在最左邊.
簡要說一下數據庫範式
- 第一範式: 屬性不可再分.
- 第二範式: 在一範式的基礎上, 要求數據庫表中的每個實例或行必須可以被惟一地區分. 通常需要為表加上一個列, 以存儲各個實例的惟一標識. 這個惟一屬性列被稱為主關鍵字或主鍵.
- 第三範式: 在二範式的基礎上, 要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息. 所以第三範式具有如下特徵:1). 每一列只有一個值. 2). 每一行都能區分. 3). 每一個表都不包含其他表已經包含的非主關鍵字信息.
一千萬條數據的表, 如何分頁查詢
數據量過大的情況下, limit offset
分頁會由於掃描數據太多而越往後查詢越慢. 可以配合當前頁最後一條ID進行查詢, SELECT * FROM T WHERE id > #{ID} LIMIT #{LIMIT}
. 當然, 這種情況下ID必須是有序的, 這也是有序ID的好處之一.
訂單表數據量越來越大導致查詢緩慢, 如何處理
分庫分表. 由於歷史訂單使用率並不高, 高頻的可能只是近期訂單, 因此, 將訂單表按照時間進行拆分, 根據數據量的大小考慮按月分表或按年分表. 訂單ID最好包含時間(如根據雪花算法生成), 此時既能根據訂單ID直接獲取到訂單記錄, 也能按照時間進行查詢.
推薦閱讀
- 我是如何通過Nginx日誌實時封禁風險IP的
- 開放API網關實踐(一) ——設計一個API網關
- 開放API網關實踐(二) —— 重放攻擊及防禦
- 開放API網關實踐(三) —— 限流
- Kubernetes(一) 跟着官方文檔從零搭建K8S
- Kubernetes(二) 應用部署
- Kubernetes(三) 如何從外部訪問服務
© 2019, 朴瑞卿.
[版權聲明] 本文發佈於朴瑞卿的博客, 允許非商業用途轉載, 但轉載必須保留原作者朴瑞卿 及鏈接:https://blog.piaoruiqing.com. 如有授權方面的協商或合作, 請聯繫郵箱: [email protected].