{eval=Array;=+count(Array);}
“我是喲喲吼說科技,專注于數(shù)據(jù)網(wǎng)絡的回答,歡迎大家與我交流數(shù)據(jù)網(wǎng)絡的問題”
如題,在mysql中,分表查詢和索引查詢那種方式更快?
喲喲認為查詢速度的快慢要針對于表里數(shù)據(jù)的多少來定,并且分表查詢時也要將索引引入才能更快的將目標數(shù)據(jù)進行鎖定,單純的來對比分表查詢和索引查詢的話,個人感覺索引查詢相對比要快一些。
在mysql中為什么會建立多個表呢?
這是因為在龐大數(shù)據(jù)量存儲時,建立多個表可以將數(shù)據(jù)進行均勻的分布,每一個表內對應多帶帶的一項數(shù)據(jù),查詢或調用時可以方便調取;若沒有分表的話,所有的數(shù)據(jù)可能存在一個表中,在寫入或查詢調取時會增加數(shù)據(jù)庫的負擔,延長查詢時間,增加磁盤的IO,因此針對大數(shù)據(jù)量存儲時最好建立不同類別的表,可以更方便更快捷的寫入并調取。
不論是分表查詢還是單表查詢一定要引入索引,這樣才能更快的定位目標數(shù)據(jù)。
因此喲喲認為,在數(shù)據(jù)量很大的情況下,建議分表+索引查詢可能速度更快,若數(shù)據(jù)量很小的情況下,直接索引查詢即可。
歡迎大家多多關注我,在下方評論區(qū)說出自己的見解。
通常使用MySQL時(其余的數(shù)據(jù)庫也一樣),大多數(shù)時候索引是必須要增加的,好處是查詢速度提升非常大,數(shù)據(jù)量越多越明顯;缺點是會對新增、修改、刪除的速度造成一定程度的影響,不過這個影響和查詢效率的提升相比,不值一提。
當單表中的數(shù)據(jù)量進一步增多,例如到了大幾千萬、幾億這個級別,單臺MySQL已經(jīng)不足以支撐這么多的數(shù)據(jù)了,這時候就要考慮分區(qū)、分表或分庫了;當然分表之后,每一個子表中仍然可以有索引。
如果非要說分表查詢和索引查詢哪個快,當數(shù)據(jù)量沒達到需要分表的程度時,比如只有一百萬的數(shù)據(jù)量,我覺得還是索引查詢快,畢竟分表查詢還需要程序路由到數(shù)據(jù)所在的分區(qū)上,這個也是需要消耗時間的。
MySQL單表數(shù)據(jù)量在一千萬以內的時候,性能是比較好的,超過千萬性能會有下降,到了五六千萬以上,性能下降就比較明顯了,這是就要考慮分表了。
分表另外一個好處是,單個服務器的性能畢竟是有限的,例如磁盤的IO,分表后將子表部署在不同的磁盤上(也可以直接分庫),可以利用多臺服務器的資源,更好地支持高并發(fā)。
RANGE分區(qū):根據(jù)某一個字段的區(qū)間,進行分區(qū)。比如按照id分區(qū),1到10萬一個分區(qū),10萬零1到20萬一個分區(qū)。
HASH分區(qū):定義一個表達式,對表達式的結果進行分區(qū)選擇。例如把id和某個整數(shù)進行取模運算,結果為1的是一個分區(qū),結果是2的一個分區(qū)。
業(yè)務字段分區(qū):這個就容易理解了,在業(yè)務數(shù)據(jù)中選擇一個合適的字段,作為分區(qū)字段。比如按照公司碼分區(qū),companyCode=1(北京)為一個分區(qū),companyCode=2(天津)為一個分區(qū);當然,一般不會選擇companyName=北京/天津這樣的字段;不過這種分表策略,不能保證數(shù)據(jù)平均,比如北京有五千萬數(shù)據(jù),天津有五百萬數(shù)據(jù)。
分表/分庫雖然看起來很美好,但是問題也不少:跨庫關聯(lián)、分布式事務、結果集合并/排序等問題,都是需要考慮解決的。
謝謝邀請!
查詢快慢主決的因素有很多,存儲碎片、數(shù)據(jù)量大屬于I/O類問題;表結構設計、查詢語句屬于技術是否熟練(經(jīng)驗)問題。對于你的分表快還是索引快的這個問題本身就是有問題的:
在建立數(shù)據(jù)表的時候,索引是必須的,主鍵就是唯一索引,
我認為需要關注查詢快慢的時候,必定是單表數(shù)據(jù)量越來越大,或是已預見數(shù)據(jù)量會越來越大,例如日志表、流水記錄等,要不就是查詢時關聯(lián)的表比較多。
如果是像配置類數(shù)據(jù)表數(shù)據(jù)量有限的表,加不加除了主鍵以外索引影響不大。
基于單數(shù)據(jù)庫來說,
那么數(shù)據(jù)量大,增速快的表要想加查詢速度的首先索引是必須的,再加上分區(qū)或是分表才能有效的提升效率,有必要還可以做讀寫分離,
但是在做分表時怎么分就要講究了,分表可以按字段(縱向)分,也可以按某(些)字段的值特性(橫向)去分,總之要盡量達到在同一分表中的數(shù)據(jù)特性相同,在生成SQL時,代碼可以決定向哪幾個分表查,達到避免查詢無關的分表,查詢的表越少,需要掃描的記錄越少,效率肯定越高,如果達不到減少讀表和記錄的話,分表不但不會變快,反而變慢。
即時原創(chuàng)回答,個人的一些體驗,僅供參考!
當然索引快,沒有索引要線性搜索,如果記錄靠后幾乎是全表搜索。理論上只要有索引,搜索速度跟記錄數(shù)沒有關系,索引是一張獨立的HASH表。但記錄數(shù)多的時候,寫入索引會變慢。
分表呢只是解決表文件大小問題,和索引不是一回事,而且MYSQL有分區(qū)表功能,不用手工維護分表。
0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答