非索引查询如何提高效率_Python数据分析:数据库索引如何提高效率?
索引在數(shù)據(jù)庫(kù)中是一個(gè)很特殊的存在,它的目的就是為了提高數(shù)據(jù)查詢(xún)得效率。同樣,它也有弊端,更新一個(gè)帶索引的表的時(shí)間比更新一個(gè)沒(méi)有帶索引的時(shí)間更長(zhǎng)。有得有失。我希望做一些研究測(cè)試,搞清楚索引對(duì)于我們使用數(shù)據(jù)庫(kù)有什么影響,以及如何控制這個(gè)影響。
聚集索引和非聚集索引聚集索引根據(jù)數(shù)據(jù)行的鍵值在表或視圖中排序和存儲(chǔ)這些數(shù)據(jù)行。索引定義中包含聚集索引列。每個(gè)表只能有一個(gè)聚集索引,因?yàn)閿?shù)據(jù)行本身只能按一個(gè)順序排序。只有當(dāng)表包含聚集索引時(shí),表中的數(shù)據(jù)行才按排序順序存儲(chǔ)。如果表具有聚集索引,則該表稱(chēng)為聚集表。如果表沒(méi)有聚集索引,則其數(shù)據(jù)行存儲(chǔ)在一個(gè)稱(chēng)為堆的無(wú)序結(jié)構(gòu)中。
聚集索引特殊的方面是:聚集索引的葉級(jí)是實(shí)際的數(shù)據(jù)-也就是說(shuō),數(shù)據(jù)重新排序,按照和聚集索引排序條件聲明的相同物理順序存儲(chǔ)。這意味著,一旦到達(dá)索引的葉級(jí),就到達(dá)了數(shù)據(jù)。而非聚集索引,到達(dá)了葉級(jí)只是找到了數(shù)據(jù)的引用。因此聚集索引帶來(lái)的空間消耗是需要額外的120%的空間。
任何新記錄都根據(jù)聚集列正確的物理順序插入到聚集索引中。創(chuàng)建新頁(yè)的方式隨需要插入記錄的位置而變化。如果新記錄需要插入到索引結(jié)構(gòu)中間,就會(huì)發(fā)生正常的頁(yè)拆分。來(lái)自舊頁(yè)的后一半記錄被移到新頁(yè),并且在適當(dāng)?shù)臅r(shí)候,將新記錄插入到新頁(yè)或舊頁(yè)。如果新記錄在邏輯上位于索引結(jié)構(gòu)的末端,那么創(chuàng)建新頁(yè),但是只將新記錄添加到新頁(yè)。在MySQL中,聚集索引可以認(rèn)為是唯一索引。
非聚集索引中的項(xiàng)目按索引鍵值的順序存儲(chǔ),而表中的信息按另一種順序存儲(chǔ)(這可以由聚集索引規(guī)定)。對(duì)于非聚集索引,可以為在表非聚集索引中查找數(shù)據(jù)時(shí)常用的每個(gè)列創(chuàng)建一個(gè)非聚集索引。非聚集索引中的項(xiàng)目按索引鍵值的順序存儲(chǔ),而表中的信息按另一種順序存儲(chǔ)(這可以由聚集索引規(guī)定)。對(duì)于非聚集索引,可以為在表非聚集索引中查找數(shù)據(jù)時(shí)常用的每個(gè)列創(chuàng)建一個(gè)非聚集索引。在MySQL中,費(fèi)聚集
引用一下網(wǎng)上常見(jiàn)的使用聚集索引和非聚集索引的使用上的注意事項(xiàng):
本文并非探索索引的數(shù)據(jù)結(jié)構(gòu)以及不同數(shù)據(jù)庫(kù)的索引區(qū)別,對(duì)于數(shù)據(jù)分析而言也不是很重要,關(guān)鍵是搞懂索引的作用、索引的區(qū)別以及怎樣使用索引。
測(cè)試環(huán)境和數(shù)據(jù)不介紹測(cè)試環(huán)境的探究都是耍流氓,下面介紹一下測(cè)試所使用的環(huán)境和數(shù)據(jù)。
機(jī)器是兩臺(tái)IBM的PC,一臺(tái)作為client,一臺(tái)作為data server;PC的硬件是I5-4590CPU 3.3GHz+4GRAM(client),I7-4790 3.6GHZ+8GRAM(server);client和server內(nèi)網(wǎng)連接;client是win7 32位,server是win7 64位操作系統(tǒng)。
測(cè)試的數(shù)據(jù)庫(kù)分別是MS SQLServer 2008R2版本和MySQL Server5.5版本。
分別再M(fèi)ySQL和SQLServer的測(cè)試數(shù)據(jù)庫(kù)建了三個(gè)表student_no(無(wú)索引),student_in(有非聚集索引),student_cin(有聚集索引),表的字段都是一致的,參考下面的建表sql。
CREATE TABLE `student_xx` ( `ID` int(11) NOT NULL, `name` varchar(10) NOT NULL, `age` int(3) NOT NULL, `address` varchar(10) NOT NULL)注意建表的過(guò)程中,我默認(rèn)有幾個(gè)設(shè)置,ID是所有數(shù)據(jù)都不一樣的,是唯一標(biāo)識(shí)符,name基本上所有人也不一樣,age的數(shù)據(jù)比較一致在[20,30]這個(gè)區(qū)間,addres只記錄所在省份城市的名字,數(shù)據(jù)范圍在300個(gè)以?xún)?nèi)。
測(cè)試結(jié)果測(cè)試使用的手段無(wú)非是對(duì)數(shù)據(jù)庫(kù)的增刪改查操作(where語(yǔ)句包含對(duì)應(yīng)聚集索引和非聚集索引的),但是也有細(xì)分,我這里進(jìn)行詳細(xì)的定義。
1. 插入操作
I1: 逐條插入,類(lèi)似insert into student (ID, name,age,address) values(10000001,‘HE KEJUN’,28,’GUANGDONGG-GUANGZHOU’),每插入100條記錄并記錄耗時(shí)
I2:批量插入,即10次每次進(jìn)行插入100條記錄
2. 修改操作
U1:修改某個(gè)字段
U2:修改多個(gè)字段,每修改100條記錄并記錄耗時(shí)
3. 刪除操作
D1:刪除某條記錄(含where語(yǔ)句),每刪除100條記錄并記錄耗時(shí)。
4. 查詢(xún)操作
S1:查詢(xún)數(shù)據(jù)
S2:查詢(xún)中帶有COUNT函數(shù)
S3:查詢(xún)中帶有SUM函數(shù)
S4:查詢(xún)中帶有ORDER BY
上述操作都是每查詢(xún)1000條記錄并記錄耗時(shí)。
我們首先看看在小數(shù)量級(jí)的數(shù)據(jù)中索引的不同表現(xiàn)。
在小數(shù)據(jù)集(數(shù)據(jù)表記錄數(shù)=10000)的情況下,各個(gè)數(shù)據(jù)庫(kù)操作的耗時(shí)如下:
MSSQL | MYSQL | |||||
無(wú)索引 | 非聚集索引 | 聚集索引 | 無(wú)索引 | 非聚集索引 | 聚集索引 | |
I1 | 0.80935 | 0.81045 | 0.8031 | 1.07525 | 0.782 | 0.79005 |
I2 | 2.1868 | 2.1891 | 2.13555 | 0.15565 | 0.1688 | 0.1478 |
D1 | 0.95685 | 0.60885 | 0.7253 | 0.9924 | 0.50565 | 0.748 |
U1 | 0.9642 | 0.78035 | 0.7368 | 0.85725 | 0.8601 | 0.78205 |
U2 | 0.8759 | 0.74055 | 0.70125 | 0.83575 | 0.53745 | 0.7721 |
S1 | 3.2293 | 2.5016 | 1.92195 | 9.2856 | 2.22845 | 1.85555 |
S2 | 2.963 | 2.051 | 2.0203 | 9.39085 | 2.2397 | 2.62835 |
S3 | 3.1109 | 2.7788 | 2.0137 | 9.38075 | 2.26215 | 2.74975 |
S4 | 9.6427 | 9.6553 | 7.2891 | 10.2789 | 5.9647 | 4.9492 |
在MS SQLSever中,索引不會(huì)明顯影響數(shù)據(jù)庫(kù)進(jìn)行插入和刪除操作。在大多數(shù)情況下,聚集索引的效率都比非聚集索引的高。即聚集索引在小規(guī)模數(shù)量級(jí)的數(shù)據(jù)表中是最佳選擇。
同樣的情況出現(xiàn)在MySQL數(shù)據(jù)庫(kù),索引對(duì)于查詢(xún)的耗時(shí)的降低是非常明顯的。計(jì)劃以后在百萬(wàn)級(jí)的數(shù)據(jù)表中再重新設(shè)計(jì)做一次實(shí)驗(yàn)再分享給大家。
End.
作者:柯君
來(lái)源:博客園
·?零基礎(chǔ)入職數(shù)據(jù)分析就業(yè)班 ·
課程形式主為“直播+錄播”
課程專(zhuān)享:月考測(cè)試通關(guān)+課程項(xiàng)目作業(yè)+1v1職場(chǎng)生涯規(guī)劃+班主任輔導(dǎo)學(xué)習(xí)+資深講師答疑
課程結(jié)束后能熟練掌握SQL、Python、Excel、PPT等數(shù)據(jù)分析工具
金3銀4招聘季,愛(ài)數(shù)據(jù)帶你成功入職數(shù)據(jù)分析!
點(diǎn)擊“閱讀原文”入職數(shù)據(jù)分析總結(jié)
以上是生活随笔為你收集整理的非索引查询如何提高效率_Python数据分析:数据库索引如何提高效率?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql %用户域_MySQL运维--
- 下一篇: oss 视频 转码_播放oss问题的搜索