日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

非索引查询如何提高效率_Python数据分析:数据库索引如何提高效率?

發(fā)布時(shí)間:2025/4/17 python 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 非索引查询如何提高效率_Python数据分析:数据库索引如何提高效率? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
-?點(diǎn)擊上方“中國(guó)統(tǒng)計(jì)網(wǎng)”訂閱我吧!-

索引在數(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。