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


不矛盾啊,这个问题问的不好


分享到:


相關文章: