欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
為什么索引可以讓查詢(xún)變快?終于有人說(shuō)清楚了!

來(lái)自:CSDN,作者:topEngineerray

鏈接:https://blog.csdn.net/topdeveloperr/article/details/88742503

概述

人類(lèi)存儲信息的發(fā)展歷程大致經(jīng)歷如下:

由于是個(gè)人憑著(zhù)自己理解總結的,因此可能不一定精確,但是毋庸置疑的是,在當代,各大公司機構部門(mén)的數據都是維護在數據庫當中的。

數據庫作為數據存儲介質(zhì)發(fā)展的最新產(chǎn)物,必然是具有許多優(yōu)點(diǎn)的,其中一個(gè)很大的優(yōu)點(diǎn)就是存儲在數據庫中的數據訪(fǎng)問(wèn)速度非???。

數據庫訪(fǎng)問(wèn)速度快的一個(gè)很重要的原因就在于索引index的作用。也就是這篇文章的主要想介紹的內容,為什么索引可以讓數據庫查詢(xún)變快?

計算機存儲原理

在理解索引這個(gè)概念之前,我們需要先了解一下計算機存儲方面的基本知識。

我們知道數據持久化之后存在了數據庫里,那么我現在的問(wèn)題是數據庫將數據存在了哪里?答案顯然是存在了計算機的存儲設備上。就個(gè)人電腦而言,數據被存在了我們的電腦存儲設備上。

計算機的存儲設備有很多種,其中速度越快的越貴,因此容量也往往越小例如我們的RAM隨機存儲器,也就是大家平時(shí)說(shuō)的內存條,速度慢的就相對便宜例如我們的硬盤(pán)。而我們的數據往往都是被存在最慢的存儲設備硬盤(pán)上的,因為存在當中的數據在斷電之后依然存在。

計算機的存儲介質(zhì)有多種,例如硬盤(pán),例如告訴緩存,不同的存儲介質(zhì)的數據讀取速度是不一樣的。例如,像RAM這樣的易失性存儲設備的讀寫(xiě)操作就非???,訪(fǎng)問(wèn)其中的數據幾乎沒(méi)有延遲性。

由于這個(gè)原因,計算機操作系統的設計是這樣的:數據永遠不會(huì )直接從硬盤(pán)等機械設備中取出,而是首先從硬盤(pán)轉移到更快的存儲設備,例如RAM,從RAM當中應用程序直接按需獲取數據。

計算機內部的機械硬盤(pán)是下面這樣的:


在一個(gè)典型的硬盤(pán)驅動(dòng)器中可以有很多個(gè)盤(pán)片,“盤(pán)片”在外觀(guān)上非常類(lèi)似于一個(gè)光盤(pán)(但具有很高的存儲容量)。盤(pán)片又被磁道分條,同時(shí)一個(gè)盤(pán)片又可以分為扇區。

要獲取數據,“盤(pán)片”需要由主軸進(jìn)行旋轉。大多數硬盤(pán)供應商都提到了主軸旋轉的速度,例如,7200轉/分和15000轉/分。磁盤(pán)中的數據總是以扇區的固定大小倍數表示。因此,如果要從硬盤(pán)訪(fǎng)問(wèn)數據,需要執行以下步驟,這也是性能開(kāi)銷(xiāo)的主要來(lái)源。

  • 確定數據所在的正確磁道,并將磁頭移動(dòng)到該磁道。即通常說(shuō)的尋道。
  • 讓“主軸”旋轉盤(pán)片,使正確的扇區位于“磁盤(pán)頭”下方。
  • 從扇區開(kāi)始到扇區結束獲取整個(gè)數據。

如果數據恰好分布在連續扇區上,那么它將提高獲取數據的性能。因為主軸和磁頭本身不需要移動(dòng)/旋轉,也就沒(méi)有太多開(kāi)銷(xiāo),但是大多數時(shí)候這種開(kāi)銷(xiāo)是存在的。

由于存在這種開(kāi)銷(xiāo),我們不能直接從硬盤(pán)獲取數據。RAM的存儲器高性能的背后的主要原因是它沒(méi)有像硬盤(pán)那樣的機械運動(dòng)部件。但是盡管RAM的性能很高,但它當中的數據卻不會(huì )用作永久存儲,斷電之后就會(huì )消失,重新啟動(dòng)之后就什么都沒(méi)有了,這是我們需要硬盤(pán)來(lái)進(jìn)行持久化的原因所在。數據庫中的數據毫無(wú)疑問(wèn)就是存放在硬盤(pán)當中的,因此訪(fǎng)問(wèn)數據庫中的數據不可避免的會(huì )經(jīng)歷磁盤(pán)操作的開(kāi)銷(xiāo)。

索引是如何工作的?

知道上述知識后,索引就更容易理解了。

舉個(gè)例子,想象一下,現在有一本500頁(yè)厚包含幾十萬(wàn)字的字典,同時(shí)里面的字是無(wú)序排列的,現在我需要你從中找出某幾個(gè)字出來(lái)同時(shí)不允許查看目錄。毫無(wú)疑問(wèn),我們只能一頁(yè)一頁(yè)的翻,這是非人類(lèi)能接受的工作,我們必然想的是先看目錄,找到相關(guān)的字或者偏旁,然后去對應的地方查找文字,這樣效率就大大提高了。目錄事實(shí)上就是一種索引,其思想一脈相承。

數據庫的索引類(lèi)似于書(shū)中的這個(gè)目錄。索引會(huì )幫助我們快速檢索數據庫,查詢(xún)不需要通過(guò)整個(gè)表來(lái)獲取數據,而是從索引中找到數據塊。以一張數據庫表為例:

上表是一張真實(shí)的數據庫表,其中每一行是一條記錄,每條記錄都有字段。假設上面的數據庫是一個(gè)有10萬(wàn)條記錄的大數據庫?,F在,我們想從10萬(wàn)條記錄中搜索一些內容,那么挨著(zhù)一個(gè)一個(gè)搜索無(wú)疑將花費很長(cháng)的時(shí)間,這個(gè)時(shí)候我們在數據結構與算法里學(xué)的二分查找法就派上了用場(chǎng)。

二分查找法

使用二分查找法,需要將數據先排序,但是其查詢(xún)效率將大大提高。

例子如下:

假設我們在上面的數據庫中使用的是固定長(cháng)度的記錄,固定塊記錄大小為205個(gè)字節, 默認塊大小是1024字節。則:

固定記錄大小=204字節,塊大小=1024字節

所以每個(gè)數據塊的記錄數=1024/204=5條記錄,10萬(wàn)條記錄就是2萬(wàn)個(gè)塊

不使用任何算法,我們要查詢(xún)100000條記錄中的某一條,,在最壞的情況下我們需要遍歷一遍2萬(wàn)block才能獲得全部100000條記錄。但如果進(jìn)行二分查找,則只需要進(jìn)行20000的對數基數2,即14.287712次即可。這意味著(zhù)我們只需對排序后的值進(jìn)行14次搜索,就可以使用二分查找到您感興趣的唯一值。

上圖是對一串數字生成的二叉查找樹(shù)。其時(shí)間復雜度為O(n)=O(log2N),即以2為底,n的對數。其中n為查找目標群體的總數據量。

例如,假設N為8,則O(n) = O(2為底8的對數) = O(3).

遍歷方式,其時(shí)間復雜度為O(n)

在上述例子當中,n就是10000。使用索引的時(shí)間復雜度為O(2為底10000的對數) 大約等于 13. 和O(10000)之間差大概800倍。

索引為何使得查詢(xún)變快?

這個(gè)時(shí)候我們就能直接回答上述問(wèn)題了,建立了索引的數據,就是通過(guò)事先排好序,從而在查找時(shí)可以應用二分查找來(lái)提高查詢(xún)效率。這也解釋了為什么索引應當盡可能的建立在主鍵這樣的字段上,因為主鍵必須是唯一的,根據這樣的字段生成的二叉查找樹(shù)的效率無(wú)疑是最高的。

為什么索引不能建立的太多?

如果一個(gè)表中所有字段的索引很大,也會(huì )導致性能下降。想象一下,如果一個(gè)索引和一個(gè)表一樣長(cháng),那么它將再次成為一個(gè)需要檢查的開(kāi)銷(xiāo)。這就好比字典的目錄非常詳細,但是其長(cháng)度已經(jīng)和所有的文字一樣長(cháng),這個(gè)時(shí)候目錄本身的效率就大大下降了。

索引有弊端嗎?

肯定是有的,索引可以提高查詢(xún)讀取性能,而它將降低寫(xiě)入性能。當有索引時(shí),如果更改一條記錄,或者在數據庫中插入一條新的記錄,它將執行兩個(gè)寫(xiě)入操作(一個(gè)操作是寫(xiě)入記錄本身,另一個(gè)操作是將更新索引)。因此,在定義索引時(shí),必須牢記以下幾點(diǎn):

  • 索引表中的每個(gè)字段將降低寫(xiě)入性能。
  • 建議使用表中的唯一值為字段編制索引。
  • 在關(guān)系數據庫中充當外鍵的字段必須建立索引,因為它們有助于跨多個(gè)表進(jìn)行復雜查詢(xún)。
  • 索引還使用磁盤(pán)空間,因此在選擇要索引的字段時(shí)要小心。

什么是聚集索引

聚集索引clustered index也叫聚簇索引,它的定義是:聚集索引的表中數據行的物理順序與列值(一般是主鍵的那一列)的邏輯順序相同,一個(gè)表中只能擁有一個(gè)聚集索引。

例如:

結合上面的表格就很好理解了:數據行的物理順序與列值的順序相同,如果我們查詢(xún)id比較靠后的數據,那么這行數據的地址在磁盤(pán)中的物理地址也會(huì )比較靠后。聚集索引存儲記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理存儲并不連續。

為什么查詢(xún)更快呢?我們通過(guò)上面的分析知道了索引是通過(guò)二叉樹(shù)的數據結構來(lái)描述的,我們可以這么理解聚簇索引:索引的葉節點(diǎn)就是數據節點(diǎn)。而非聚簇索引的葉節點(diǎn)仍然是索引節點(diǎn),只不過(guò)有一個(gè)指針指向對應的數據塊。

主鍵一般會(huì )默認創(chuàng )建聚集索引。

在創(chuàng )建聚集索引之前,應先了解您的數據是如何被訪(fǎng)問(wèn)的??煽紤]將聚集索引用于:

包含大量非重復值的列。使用下列運算符返回一個(gè)范圍值的查詢(xún):BETWEEN、>、>=、< 和 <=。被連續訪(fǎng)問(wèn)的列。返回大型結果集的查詢(xún)。經(jīng)常被使用聯(lián)接或 GROUP BY 子句的查詢(xún)訪(fǎng)問(wèn)的列;一般來(lái)說(shuō),這些是外鍵列。對 ORDER BY 或 GROUP BY 子句中指定的列進(jìn)行索引,可以使 SQL Server 不必對數據進(jìn)行排序,因為這些行已經(jīng)排序。這樣可以提高查詢(xún)性能。OLTP型的應用程序,這些程序要求進(jìn)行非??焖俚膯涡胁檎遥ㄒ话阃ㄟ^(guò)主鍵)。應在主鍵上創(chuàng )建聚集索引。聚集索引不適用于:

頻繁更改的列 這將導致整行移動(dòng),因為 SQL Server 必須按物理順序保留行中的數據值。這一點(diǎn)要特別注意,因為在大數據量事務(wù)處理系統中數據是易失的

索引失效的典型例子

條件中用or,即使其中有條件帶索引,也不會(huì )使用索引查詢(xún),這就是查詢(xún)盡量不要用or的原因,用in吧。

常見(jiàn)的sql優(yōu)化手段有哪些

1.避免全表掃描

全表掃描往往發(fā)生在下面幾種情況:

  • SQL的on子句或者where子句涉及到的列上沒(méi)有索引;
  • 表數據量很小,走索引查詢(xún)比全表掃描更麻煩;這對于少于10行且行長(cháng)度較短的表來(lái)說(shuō)很常見(jiàn)

2.避免索引失效

不在索引列上做任何操作(計算,函數、自動(dòng)or手動(dòng)類(lèi)型轉換),這樣會(huì )導致索引失效而轉向全表掃描。

存儲引擎不能使用索引中范圍條件右邊的列。這個(gè)是因為age中查詢(xún)時(shí)范圍查詢(xún)了,pos列的索引就沒(méi)有生效了。

盡量使用覆蓋索引(只訪(fǎng)問(wèn)索引的查詢(xún)(索引列和查詢(xún)列一致)),減少select *。

對于MySQL而言:

  • mysql在使用不等于(!=或者<>)的時(shí)候無(wú)法使用索引會(huì )導致全表掃描
  • is null,is not null也無(wú)法使用索引
  • like 通配符開(kāi)頭'%abc..',mysql索引會(huì )失效會(huì )變成全表掃描的操作

3.避免排序,不能避免,盡量選擇索引排序

4.避免查詢(xún)不必要的字段

5.避免臨時(shí)表的創(chuàng )建,刪除


--- EOF ---
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
諾禾指導你一文看懂mysql數據庫分區表概念、類(lèi)型、適用場(chǎng)景、優(yōu)缺點(diǎn)及原理
MySQL 從零開(kāi)始:01 數據庫簡(jiǎn)介
順豐快遞:請簽收MySQL靈魂十連問(wèn)
Mysql優(yōu)化一
數據庫表為什么不可以只設置一個(gè)主鍵,一個(gè)text類(lèi)型,序列化存儲對象,這難道不跟nosql差不多了?
數據庫存儲
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久