mysql中,分表查詢和索引查詢哪個更快?

dr259


分表和索引並不是二選一的問題

通常使用MySQL時(其餘的數據庫也一樣),大多數時候索引是必須要增加的,好處是查詢速度提升非常大,數據量越多越明顯;缺點是會對新增、修改、刪除的速度造成一定程度的影響,不過這個影響和查詢效率的提升相比,不值一提。

當單表中的數據量進一步增多,例如到了大幾千萬、幾億這個級別,單臺MySQL已經不足以支撐這麼多的數據了,這時候就要考慮分區、分表或分庫了;當然分表之後,每一個子表中仍然可以有索引。

如果非要說分表查詢和索引查詢哪個快,當數據量沒達到需要分表的程度時,比如只有一百萬的數據量,我覺得還是索引查詢快,畢竟分表查詢還需要程序路由到數據所在的分區上,這個也是需要消耗時間的。

多說說分表的事兒

MySQL單表數據量在一千萬以內的時候,性能是比較好的,超過千萬性能會有下降,到了五六千萬以上,性能下降就比較明顯了,這是就要考慮分表了。

分表另外一個好處是,單個服務器的性能畢竟是有限的,例如磁盤的IO,分表後將子表部署在不同的磁盤上(也可以直接分庫),可以利用多臺服務器的資源,更好地支持高併發。

常見的分庫分表策略

  • RANGE分區:根據某一個字段的區間,進行分區。比如按照id分區,1到10萬一個分區,10萬零1到20萬一個分區。

  • HASH分區:定義一個表達式,對錶達式的結果進行分區選擇。例如把id和某個整數進行取模運算,結果為1的是一個分區,結果是2的一個分區。

  • 業務字段分區:這個就容易理解了,在業務數據中選擇一個合適的字段,作為分區字段。比如按照公司碼分區,companyCode=1(北京)為一個分區,companyCode=2(天津)為一個分區;當然,一般不會選擇companyName=北京/天津這樣的字段;不過這種分表策略,不能保證數據平均,比如北京有五千萬數據,天津有五百萬數據。

分表/分庫雖然看起來很美好,但是問題也不少:跨庫關聯、分佈式事務、結果集合並/排序等問題,都是需要考慮解決的。

我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。


會點代碼的大叔


分表

這兩個比較其實意義不是很大,首先分表策略指的mysql水平分割,這是一種設計模式,為了應對大數據下所有的數據都指向一個表而導致數據表壓力很大的一種情況,垂直分割,可以把壓力一下分攤到各個分表中,降低單表的壓力。分表一般根據id取餘來設計。

索引

首先你得明白,什麼是索引。如果把數據比作是字典中的所有字,那麼索引就是目錄頁,索引的目的就是為了加快查詢,減少IO,mysql的索引就是B+樹,索引最初來源二分法,二分法的好處就是查詢一個數據,先從中間找,然後判斷是要找的數據是在左邊還是右邊,然後再對半...。

誰更快

分表和索引對比沒什麼意義,就算你分表了,但是沒有索引,這個就是個不合理的表,查詢就很慢。如果你建立了索引,但是這張表的數據非常大可能上千萬甚至上億,這時你沒分表,那麼索引的作用可能不大了,因為數據太大了,查詢效率依然很低。



修煉內功的程序員


“我是喲喲吼說科技,專注於數據網絡的回答,歡迎大家與我交流數據網絡的問題”

如題,在mysql中,分表查詢和索引查詢那種方式更快?

喲喲認為查詢速度的快慢要針對於表裡數據的多少來定,並且分表查詢時也要將索引引入才能更快的將目標數據進行鎖定,單純的來對比分表查詢和索引查詢的話,個人感覺索引查詢相對比要快一些。

在mysql中為什麼會建立多個表呢?

這是因為在龐大數據量存儲時,建立多個表可以將數據進行均勻的分佈,每一個表內對應單獨的一項數據,查詢或調用時可以方便調取;若沒有分表的話,所有的數據可能存在一個表中,在寫入或查詢調取時會增加數據庫的負擔,延長查詢時間,增加磁盤的IO,因此針對大數據量存儲時最好建立不同類別的表,可以更方便更快捷的寫入並調取。

索引是對數據庫表中一列或多列的值進行排序的結構,用於快速查詢數據庫表中的特定記錄,提高查詢速度。

不論是分表查詢還是單表查詢一定要引入索引,這樣才能更快的定位目標數據。

因此喲喲認為,在數據量很大的情況下,建議分表+索引查詢可能速度更快,若數據量很小的情況下,直接索引查詢即可。

歡迎大家多多關注我,在下方評論區說出自己的見解。


喲喲吼說科技


查詢快慢主決的因素有很多,存儲碎片、數據量大屬於I/O類問題;表結構設計、查詢語句屬於技術是否熟練(經驗)問題。對於你的分錶快還是索引快的這個問題本身就是有問題的:

在建立數據表的時候,索引是必須的,主鍵就是唯一索引,

我認為需要關注查詢快慢的時候,必定是單表數據量越來越大,或是已預見數據量會越來越大,例如日誌表、流水記錄等,要不就是查詢時關聯的表比較多。

如果是像配置類數據表數據量有限的表,加不加除了主鍵以外索引影響不大。

基於單數據庫來說,

那麼數據量大,增速快的表要想加查詢速度的首先索引是必須的,再加上分區或是分表才能有效的提升效率,有必要還可以做讀寫分離,

但是在做分表時怎麼分就要講究了,分表可以按字段(縱向)分,也可以按某(些)字段的值特性(橫向)去分,總之要儘量達到在同一分表中的數據特性相同,在生成SQL時,代碼可以決定向哪幾個分表查,達到避免查詢無關的分表,查詢的表越少,需要掃描的記錄越少,效率肯定越高,如果達不到減少讀表和記錄的話,分表不但不會變快,反而變慢。


鑫星亮


當然索引快,沒有索引要線性搜索,如果記錄靠後幾乎是全表搜索。理論上只要有索引,搜索速度跟記錄數沒有關係,索引是一張獨立的HASH表。但記錄數多的時候,寫入索引會變慢。

分表呢只是解決表文件大小問題,和索引不是一回事,而且MYSQL有分區表功能,不用手工維護分表。


光明右使8787


不矛盾啊,這個問題問的不好


分享到:


相關文章: