{eval=Array;=+count(Array);}
“我是哟哟吼说科技,专注于数据网络的回答,欢迎大家与我交流数据网络的问题”
如题,在mysql中,分表查询和索引查询那种方式更快?
哟哟认为查询速度的快慢要针对于表里数据的多少来定,并且分表查询时也要将索引引入才能更快的将目标数据进行锁定,单纯的来对比分表查询和索引查询的话,个人感觉索引查询相对比要快一些。
在mysql中为什么会建立多个表呢?
这是因为在庞大数据量存储时,建立多个表可以将数据进行均匀的分布,每一个表内对应多带带的一项数据,查询或调用时可以方便调取;若没有分表的话,所有的数据可能存在一个表中,在写入或查询调取时会增加数据库的负担,延长查询时间,增加磁盘的IO,因此针对大数据量存储时最好建立不同类别的表,可以更方便更快捷的写入并调取。
不论是分表查询还是单表查询一定要引入索引,这样才能更快的定位目标数据。
因此哟哟认为,在数据量很大的情况下,建议分表+索引查询可能速度更快,若数据量很小的情况下,直接索引查询即可。
欢迎大家多多关注我,在下方评论区说出自己的见解。
通常使用MySQL时(其余的数据库也一样),大多数时候索引是必须要增加的,好处是查询速度提升非常大,数据量越多越明显;缺点是会对新增、修改、删除的速度造成一定程度的影响,不过这个影响和查询效率的提升相比,不值一提。
当单表中的数据量进一步增多,例如到了大几千万、几亿这个级别,单台MySQL已经不足以支撑这么多的数据了,这时候就要考虑分区、分表或分库了;当然分表之后,每一个子表中仍然可以有索引。
如果非要说分表查询和索引查询哪个快,当数据量没达到需要分表的程度时,比如只有一百万的数据量,我觉得还是索引查询快,毕竟分表查询还需要程序路由到数据所在的分区上,这个也是需要消耗时间的。
MySQL单表数据量在一千万以内的时候,性能是比较好的,超过千万性能会有下降,到了五六千万以上,性能下降就比较明显了,这是就要考虑分表了。
分表另外一个好处是,单个服务器的性能毕竟是有限的,例如磁盘的IO,分表后将子表部署在不同的磁盘上(也可以直接分库),可以利用多台服务器的资源,更好地支持高并发。
RANGE分区:根据某一个字段的区间,进行分区。比如按照id分区,1到10万一个分区,10万零1到20万一个分区。
HASH分区:定义一个表达式,对表达式的结果进行分区选择。例如把id和某个整数进行取模运算,结果为1的是一个分区,结果是2的一个分区。
业务字段分区:这个就容易理解了,在业务数据中选择一个合适的字段,作为分区字段。比如按照公司码分区,companyCode=1(北京)为一个分区,companyCode=2(天津)为一个分区;当然,一般不会选择companyName=北京/天津这样的字段;不过这种分表策略,不能保证数据平均,比如北京有五千万数据,天津有五百万数据。
分表/分库虽然看起来很美好,但是问题也不少:跨库关联、分布式事务、结果集合并/排序等问题,都是需要考虑解决的。
谢谢邀请!
查询快慢主决的因素有很多,存储碎片、数据量大属于I/O类问题;表结构设计、查询语句属于技术是否熟练(经验)问题。对于你的分表快还是索引快的这个问题本身就是有问题的:
在建立数据表的时候,索引是必须的,主键就是唯一索引,
我认为需要关注查询快慢的时候,必定是单表数据量越来越大,或是已预见数据量会越来越大,例如日志表、流水记录等,要不就是查询时关联的表比较多。
如果是像配置类数据表数据量有限的表,加不加除了主键以外索引影响不大。
基于单数据库来说,
那么数据量大,增速快的表要想加查询速度的首先索引是必须的,再加上分区或是分表才能有效的提升效率,有必要还可以做读写分离,
但是在做分表时怎么分就要讲究了,分表可以按字段(纵向)分,也可以按某(些)字段的值特性(横向)去分,总之要尽量达到在同一分表中的数据特性相同,在生成SQL时,代码可以决定向哪几个分表查,达到避免查询无关的分表,查询的表越少,需要扫描的记录越少,效率肯定越高,如果达不到减少读表和记录的话,分表不但不会变快,反而变慢。
即时原创回答,个人的一些体验,仅供参考!
当然索引快,没有索引要线性搜索,如果记录靠后几乎是全表搜索。理论上只要有索引,搜索速度跟记录数没有关系,索引是一张独立的HASH表。但记录数多的时候,写入索引会变慢。
分表呢只是解决表文件大小问题,和索引不是一回事,而且MYSQL有分区表功能,不用手工维护分表。
0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答