您好我在mysql中有一个表(存储引擎是InnoDB),格式如下
id整数, word1 varchar(50), word2 varchar(50), field1 int, field2 float,
记录数量达到1亿。我需要一次查询大约1000条记录,找到与“word1”匹配的单词。我在word1上有一个索引,在word2上有另一个索引。当我运行像
这样的查询时 select * from mytable where word1='someword'
检索数据需要20-40秒。我可以做些什么来优化读取?是否会使用任何其他数据库节省大量时间?
德文郡的更新:
我在我的个人联想笔记本电脑上运行它。它的1TB硬盘(SATA / 5200转/ EXT4),intel i7,8GB RAM。
这是运行后的结果
show indexes from mytable\G
mysql> show indexes from mytable\G
*************************** 1. row ***************************
Table: mytable
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 86308613
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 2. row ***************************
Table: mytable
Non_unique: 1
Key_name: mytable_word1
Seq_in_index: 1
Column_name: word1
Collation: A
Cardinality: 198
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 3. row ***************************
Table: mytable
Non_unique: 1
Key_name: mytable_word2
Seq_in_index: 1
Column_name: word2
Collation: A
Cardinality: 198
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
答案 0 :(得分:1)
mytable_word1
的基数表示word1
只有大约198个不同的值。将其与唯一索引的基数进行比较,该索引的值大约为8630万。
(如果需要,请参阅What is cardinality in MySQL?以获得解释)。
因此,与任何特定单词匹配的数字行应该(统计上讲)86.3*10^6 / 200
= 431500
结果,分散在整个大表中。
读取硬盘驱动器上的分散块是最糟糕的情况,而且在笔记本电脑上,你有一个单独的慢速硬盘。 SELECT所需的20-40s
并不令人惊讶。
该问题并非特定于任何特定数据库。
为了加快速度,您可以考虑对大表进行分区,例如沿word1
的第一个字母进行分区,但如果您还需要独立搜索word2
,则无法提供帮助word1
。