请教 1 亿行数据的 mysql 对 int 类型的列做索引,能对查询时 where col = 222 做优化吗?比如避免全表扫描/Hash 索引。

2017-10-18 21:16:47 +08:00
 a251922581
数据库比较大有几百 G,硬盘 IO 吞吐量比较低,所以要避免全表扫描,原来业务 where 列都是加了 HASH 索引的,现在新的需求有个列是 INT(10) UNSIGNED 的数字。
先谢过。。
3559 次点击
所在节点    MySQL
9 条回复
tuzhenyu
2017-10-18 21:34:55 +08:00
MySql 支持 hash 索引?
opengps
2017-10-18 21:40:35 +08:00
这个数据级别,分表分区吧
opengps
2017-10-18 21:41:41 +08:00
我有个十亿级别数据库,sqlserver 实现的,但是,设计结构采用无主键方式,时间聚集索引
a251922581
2017-10-18 21:44:30 +08:00
@tuzhenyu 对 varchar 应该可以吧,INDEX `idx_text` USING HASH(TEXT)
lujjjh
2017-10-19 07:56:22 +08:00
@a251922581 InnoDB 和 MyISAM 都不支持 HASH 索引。坑点在于你这么写不会报错,实际上建的却是 BTree 索引……
sagaxu
2017-10-19 08:14:56 +08:00
如果 col=222 的行很多,依然会全表扫
sunchen
2017-10-19 14:00:51 +08:00
能,不过具体效果取决于这一列的数据分布的离散情况,以及和数据主键的的分布的相关性。如果 222 的数据在 1 亿数据里分布很广,IO 依然很多
sunkuku
2017-10-19 18:21:13 +08:00
1.column 尽量不要用 int 类型
2.尽量设计多列、覆盖索引,避免二次随机寻盘
3.这个场景不适合 hash 索引,因为 hash 索引会大大增加索引空间,如果你的 hash 函数简单的话,还要处理 hash 冲突

最后一点,也是搜索效率最高的一种方法,读效率可能提升百倍。但是有大的空间损耗和写数据变慢
就是建一个冗余的表,primary key = int_column + (increased number) 。就是说让你的 int column 成为 primary key 的前缀。这样在搜索的时候,全部是顺序查找,只需要一次寻盘。
a251922581
2017-10-19 21:04:39 +08:00
@sunkuku
@sunchen
多谢指点

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/398758

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX