哪个磁盘数据库读取速度最快

时间:2015-03-22 04:41:37

标签: mysql database postgresql

您好我在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:

1 个答案:

答案 0 :(得分:1)

mytable_word1的基数表示word1只有大约198个不同的值。将其与唯一索引的基数进行比较,该索引的值大约为8630万。 (如果需要,请参阅What is cardinality in MySQL?以获得解释)。

因此,与任何特定单词匹配的数字行应该(统计上讲)86.3*10^6 / 200 = 431500结果,分散在整个大表中。

读取硬盘驱动器上的分散块是最糟糕的情况,而且在笔记本电脑上,你有一个单独的慢速硬盘。 SELECT所需的20-40s并不令人惊讶。 该问题并非特定于任何特定数据库。

为了加快速度,您可以考虑对大表进行分区,例如沿word1的第一个字母进行分区,但如果您还需要独立搜索word2,则无法提供帮助word1