色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

從程序員的角度以MySQL為例探索數據庫的奧秘

電子工程師 ? 來源:未知 ? 作者:胡薇 ? 2018-10-28 09:01 ? 次閱讀

數據庫基本原理

我對DB的理解

第一:數據庫的組成:存儲 + 實例

不必多說,數據當然需要存儲;存儲了還不夠,顯然需要提供程序對存儲的操作進行封裝,對外提供增刪改查的API,即實例。

一個存儲,可以對應多個實例,這將提高這個存儲的負載能力以及高可用;多個存儲可以分布在不同的機房、地域,將實現容災。

第二:按Block or Page讀取數據

用大腿想也知道,數據庫不可能按行讀取數據(Why? ? ^_^)。實質上,數據庫,如Oracle/MySQL,都是基于固定大小(比如16K)的物理塊(Block or Page,我這里就不區分統一稱為Block)來實現調度和管理的。要知道Block是數據庫的概念,如何對應到文件系統呢?顯然需要指出“這個Block的地址在哪里”,當查找到地址后,讀取固定大小的數據就相當于完成了Block的讀取了。

數據庫很聰明的,它不會僅僅只讀取需要讀取的Block,它還會替我們把附近的Block塊都讀取加載至內存。實際上,這是為了減少IO次數,提高命中率。事實上,一個Block塊的附近Block也是熱點數據,這種處理方式很有必要!

第三:磁盤IO是數據庫的性能瓶頸

毫無疑問,數據在磁盤上,少不了磁盤IO。什么磁頭旋轉,定位磁道,尋址的過程,就不說了,我們是程序員,也管不了這些。但是這個過程確實是非常耗時的,和內存讀取不是一個數量級,所以后來出現了很多方式來減少IO,提升數據庫性能。

比如,增加內存,讓數據庫把數據更多的加載至內存。內存雖好,但也不能濫用,為什么這么說呢?假設數據庫中有100G數據,如果都加載至內存,也就說數據庫要管理100G磁盤數據+100G內存數據,你說累不累?(數據庫要處理磁盤和內存的映射關系,數據的同步,還要對內存數據進行清理,如果涉及數據庫事務,又是一系列復雜操作……)不過這里需要指出的是,為了加快內存查找速度,數據庫一般對內存進行HASH存放。

比如,利用索引,索引相比內存,是一個性價比非常高的東西,后文詳細介紹MySQL的索引原理。

比如,利用性能更好的磁盤…(和咱們就沒關系呢)

第四,提出一些問題思考下:

為什么我們說利用delete刪除一個表的數據較trancate一個表要慢?

【一個按行查找刪除,多費勁;一個基于Block的體系結構刪除】為什么我們說要小表驅動大表?【小表驅動大表會快?什么鬼?MN和NM不是一樣的么?有鬼的地方,就有索引!】

探索MySQL索引背后的原理

對于絕大數的應用系統,讀寫比例在10:1,甚至100:1,而且insert/update很難出現性能問題,遇到最多的,最棘手的就是select了,select優化是重中之重,顯然少不了索引!

說起MySQL的索引,我們會冒出很多這些東西:BTree索引/B+Tree索引/Hash索引/聚集索引/非聚集索引…這么多,暈頭!

索引到底是什么,想解決什么問題?

老生常談了,官網說MySQL索引是一種數據結構,索引的目的就是為了提高查詢效率。

說白了,不使用索引的話,磁盤IO次數比較多!要想減少磁盤IO次數,怎么辦?

我們想通過不斷縮小想要獲取的數據的范圍來篩選出最終想要的結果,把每次查找數據的磁盤IO次數控制在一個很小的數量級,最好是常數數量級。

為了應對上述問題,B+Tree索引出來了!

Hello,B+Tree

在MySQL中,不同存儲引擎對索引的實現方式是不同的,這里將重點分析MyISAM和Innodb。

MyISAM引擎的B+Tree索引結構

我們知道對于MyISAM引擎而言,數據文件和索引文件是分離的。從圖中也可以看出,通過索引查找到后,就得到了數據的物理地址,然后根據地址定位數據文件中的記錄即可。這種方式也叫"非聚集索引"。

而對于Innodb引擎而言,數據文件本身是索引文件!通俗點說,葉子節點上,MyISAM存儲的是記錄的物理地址,而Innodb上存儲的是數據內容,這種方式即"聚集索引"。

另外一點需要注意的是,對于Innodb而言,主鍵索引中葉子節點存儲的是數據內容,而普通索引的葉子節點中存儲的是主鍵值!也就是說,對于Innodb的普通索引字段查找,先通過普通索引的B+Tree查找到主鍵后,然后通過主鍵索引的B+Tree進行查找。從這里你可以看出,對于Innodb而言,主鍵的建立非常重要!

而對于MyISAM而言,主鍵索引和普通索引僅僅的區別在于主鍵只需要查找到一條記錄即可停止,而普通索引允許重復,找到一條記錄后需要繼續查找,在結構上沒有區別,如上圖所示。

深入B+Tree

提幾個問題:

為什么B+Tree把真實的數據放到葉子節點,而不是內層節點?

為什么我們說索引字段要盡可能短,最好是單調遞增的?

為什么復合索引存在最左匹配原則?

范圍查詢(>,<,between,like)對最左匹配有什么影響?

關于B+Tree的一些數學理論,咱們就不玩了,至少一點可以肯定的是:數據表的數據量N=F(樹的高度h,每個Block存儲的索引的個數m)。在N一定的情況下,索引字段越小,那么m會越大,這意味著h將越小!樹越低,當然查找的更快!

如果內層節點存放真實的數據,顯然m會變小,樹將變高。

在實際應用中,我們應該盡可能采用單調遞增的字段作為主鍵,一方面不會使得索引的數據結構變大,減小了索引占用的空間;另一方面也不會頻繁的分裂B+Tree,使得效率下降。

比如復合索引(name,age,sex),B+Tree會優先比較name來確定下一步的搜索方向。如果突然來了個(age,sex),根本上就無從下手。這也是符合常理的,對于一本書,我們說“找到第幾章第幾節的XXX”,從沒有聽說過“找到第幾節的XXX”!這是復合索引的重要特性,即最左匹配特性。

假設存在復合索引(name,age,sex),我們在進行select的時候,并沒有按照這個順序進行,而是sex = 'man' and name = '***z' and age = 27,是否會使用索引呢?數據庫是很聰明的,在SQL優化的時候,會自動幫助我們調整!但是如果缺失了復合索引的第一列,數據庫也將無能為力呢。

對于最左匹配,MySQL會一直向右匹配直到遇到范圍查詢就停止匹配。什么意思?比如復合索引(name,age,sex),對于name = 'zhangfengzhe' and age > 26 and sex = 'man',實際上只利用到了復合索引的name列。

想利用索引,就得“干凈”

什么叫“干凈”?就是不要讓索引參與計算!比如在索引上應用函數,很可能導致索引失效。為什么呢?

其實不用想,B+Tree上存儲的是數據,要比較的話,需要把所有的數據都應用上函數,顯然成本太大。

想建立索引,看看區分度

索引雖然物美價廉,但是也別亂來。count(distinct col) / count(*)可以算一下col的區分度,顯然對于主鍵而言,就是1。區分度太低的話,可以考慮下,是否還有必要建立索引呢?

Hash索引

這里并不是要深入分析Hash索引,而是要說明一下Hash的思想真是無處不在!在MySQL的Memory存儲引擎中,存在hash函數,給一個key,通過hash函數進行計算得到地址,所以通常情況下,hash索引查找,會非常快,O(1)的速度。但是也存在hash沖突,和HashMap一樣,通過單鏈表的形式解決。

思考下,hash索引是否支持范圍查詢呢?

顯然是不支持的,它只能給一個KEY去查找。就如同HashMap一樣,查找key包含"zhangfengzhe"的,會很快么?

SQL優化神器:explain

SQL優化的場景很多,網上的技巧也很多,完全記不住!

要想徹底解決這個問題,我想只有把索引背后的數據結構和原理做適當的理解,遇到書寫SQL或者SQL慢查詢的時候,我們有基礎去分析,再利用好explain工具去驗證,就應該問題不大呢。

explain查詢的結果,可以告訴你哪些索引正在被使用,表是如何被掃描的等等。這里我將演示個Demo。

數據表student:

注意復合索引(age,address)

符合最左前綴匹配

復合索引失效

OK,到這里,準備結束了,查詢容易,優化不易,且寫且珍惜!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 程序員
    +關注

    關注

    4

    文章

    951

    瀏覽量

    29799
  • MySQL
    +關注

    關注

    1

    文章

    804

    瀏覽量

    26533

原文標題:從程序員的角度深入理解 MySQL

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    mysql數據庫同步原理

    數據庫的訪問壓力,提升整個系統的性能和可用性,降低了大訪問量引發數據庫宕機的故障率。 binlog簡介 MySQL主從同步是基于binlog文件主從復制實現,為了更好的理解主從同步過程,這里簡單介紹一下binlog日志文件。
    發表于 09-28 11:49 ?0次下載
    <b class='flag-5'>mysql</b><b class='flag-5'>數據庫</b>同步原理

    PHP的Mysql數據庫備份腳本的程序免費下載

    本文檔的主要內容詳細介紹的是PHP的Mysql數據庫備份腳本的程序免費下載。
    發表于 06-28 15:37 ?2次下載

    MySQL數據庫如何安裝和使用說明

    MySQL數據庫開發 基礎概念 1.數據:描述事物特征的符號,屬性 2.數據庫的概念:管理計算機中的數據的倉庫 2.
    的頭像 發表于 02-13 16:13 ?2793次閱讀

    MySQL數據庫:理解MySQL的性能優化、優化查詢

    最近一直在為大家更新MySQL相關學習內容,可能有朋友不懂MySQL的重要性。在程序,語言,架構更新換代頻繁的今天,MySQL 恐怕是大家使用最多的存儲
    的頭像 發表于 07-02 17:18 ?3091次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>數據庫</b>:理解<b class='flag-5'>MySQL</b>的性能優化、優化查詢

    數據庫的鎖機制真正的原理

    MySQL數據庫中,為了解決并發問題,引入了很多的鎖機制,很多時候,數據庫的鎖是在有數據庫操作的過程中自動添加的。所以,這就導致很多程序員
    的頭像 發表于 11-12 09:33 ?2261次閱讀

    MySQL端口可以MySQL數據庫中存儲和檢索數據

    MySQL端口可以MySQL數據庫中存儲和檢索數據。 概覽 建立連接后,端口讀取數據庫中存在的
    的頭像 發表于 02-15 14:07 ?1670次閱讀

    華為云數據庫-RDS for MySQL數據庫

    華為云數據庫-RDS for MySQL數據庫 華為云數據庫作為華為云的一款數據庫產品,它主要是以MyS
    的頭像 發表于 10-27 11:06 ?1515次閱讀

    MySQL數據庫管理與應用

    MySQL數據庫管理與應用 MySQL是一種廣泛使用的關系型數據庫管理系統,被認為是最流行和最常見的開源數據庫之一。它可以被用于多種不同的應
    的頭像 發表于 08-28 17:15 ?971次閱讀

    mysql是一個什么類型的數據庫

    MySQL是一種關系型數據庫管理系統(RDBMS),用于存儲和管理大量結構化數據。它被廣泛用于各種應用程序和網站的后端,包括電子商務平臺、社交媒體網站、金融系統等等。
    的頭像 發表于 11-16 14:43 ?1769次閱讀

    數據庫mysql基本增刪改查

    MySQL是一種開源的關系型數據庫管理系統,常用于Web應用程序數據存儲和管理。通過使用MySQL,用戶可以進行
    的頭像 發表于 11-16 16:35 ?1505次閱讀

    MySQL數據庫基礎知識

    MySQL 是一種開源的關系型數據庫管理系統,它是目前最流行的數據庫之一。MySQL 提供了一種結構化的方法來管理大量的數據,并且具有高效、
    的頭像 發表于 11-21 11:09 ?970次閱讀

    mysql數據庫基礎命令

    MySQL是一個流行的關系型數據庫管理系統,經常用于存儲、管理和操作數據。在本文中,我們將詳細介紹MySQL的基礎命令,并提供與每個命令相關的詳細解釋。 登錄
    的頭像 發表于 12-06 10:56 ?584次閱讀

    eclipse怎么連接數據庫mysql

    MySQL官方網站下載JDBC驅動程序(通常是一個JAR文件)。確保選擇與你安裝的MySQL數據庫版本相匹配的驅動程序。 創建Eclipse
    的頭像 發表于 12-06 11:06 ?1291次閱讀

    數據庫數據恢復—未開啟binlog的Mysql數據庫數據恢復案例

    mysql數據庫數據恢復環境: 本地服務器,windows server操作系統 ,部署有mysql單實例,數據庫引擎類型
    的頭像 發表于 12-08 14:18 ?1132次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—未開啟binlog的<b class='flag-5'>Mysql</b><b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復案例

    數據庫數據恢復—Mysql數據庫表記錄丟失的數據恢復流程

    Mysql數據庫故障: Mysql數據庫表記錄丟失。 Mysql數據庫故障表現: 1、
    的頭像 發表于 12-16 11:05 ?109次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—<b class='flag-5'>Mysql</b><b class='flag-5'>數據庫</b>表記錄丟失的<b class='flag-5'>數據</b>恢復流程
    主站蜘蛛池模板: 嫩草亚洲国产精品| 精品无码人妻一区二区免费AV| 成人免费视频在线看| WWW亚洲精品久久久无码| 丰满艳妇亲伦| 国内高清在线观看视频| 精品国产乱码久久久久久乱码 | 黑人巨大交牲老太| 久久re视频这里精品一本到99| 老师洗澡让我吃她胸的视频| 嫩草影院在线观看精品视频| 日日噜噜噜夜夜爽爽狠狠 | 欧洲xxxxx| 我就去色色| 亚洲中文日韩日本在线视频| 在线观看国产区| 哺乳溢出羽月希中文字幕| 国产精品无码AV天天爽人妻蜜桃| 精品无码乱码AV| 漂亮妈妈中文字幕版| 小草高清视频免费直播| 在线亚洲免费| 儿媳妇完整版视频播放免费观看| 国语大学生自产拍在线观看| 美女张开腿让我了一夜| 色宅男午夜电影网站| 诱受H嗯啊巨肉各种play| 爱穿丝袜的麻麻3d漫画acg| 国产亚洲欧美日韩综合综合二区| 伦理79电影网在线观看| 色多多污网站在线观看| 伊人久在线| 观赏女性排尿| 久久亚洲精品AV成人无| 色爰情人网站| 69夫妇交友群| 国产精品亚洲电影久久成人影院 | 在线看片av以及毛片| 成人国产亚洲精品A区天堂蜜臀| 精彩国产萝视频在线| 秋霞电影网伦大理电影在线观看|