我有一个包含3列和2300万行的表。每一行包含一个主键,int值和一个"一个单一的"一句话,就是这样。每个单词长度为3个字符。换句话说,每个单词" Hash Representation"在那里。表大小为5 GB。这张表索引很好。
现在我要用真正的单词创建相同的表,不再有3个字符的哈希。所以每个单词都包含正常的字母数。现在这个表包含2300万行,3列。但是,由于单词的长度超过3个字符的哈希值,因此表的大小为15 GB。这张表索引很好。
这两个表之间的唯一区别是,在第一个表中,Hash
的数据类型是char(3)
。现在在第二个表中," non_hashed_word"的数据类型是varchar(20)
。
现在请看下面的代码,我们在上面提到的表格中运行了这些代码。此代码运行0.01秒。
SELECT `indexVal`, COUNT(`indexVal`) AS OverlapWords, `UniqueWordCount`,
(COUNT(`indexVal`)/`UniqueWordCount`) AS SimScore FROM `key_word`WHERE `hashed_word` IN
('001','01v','0ji','0k9','0vc','0@v','0%d','13#' ,'148'
,'1e1','1sx','1v$','1@c','1?b','1?k','226','2kl','2ue','2*l','2?4','36h','3au','3us','4d~')
GROUP BY (`indexVal`) LIMIT 500
我们期望在新表中运行相同的代码。
所以我的问题是,即使行数和列数相同,我们的查询也可以生效,因为现在表大小要大得多吗?或者因为数据类型现在是varchar()
?
答案 0 :(得分:-1)
肯定是的。使用EXPLAIN来获取查询计划。另一个原因:
限制必须将整个结果集设置为获得前500个 - >更多行,更多数据
需要为每一行执行操作(count,/等..)
如果存在索引,当行数较多时可以更大,可以在磁盘上分段
等...