【发布时间】:2011-03-01 11:08:13
【问题描述】:
我有一个非常大的 MySQL 表,其中包含大约 150,000 行数据。目前,当我尝试运行时
SELECT * FROM table WHERE id = '1';
代码运行良好,因为 ID 字段是主索引。 但是,对于该项目的最新发展,我必须按另一个字段搜索数据库。例如:
SELECT * FROM table WHERE product_id = '1';
该字段以前没有被索引;但是,我添加了一个,所以 mysql 现在索引该字段,但是当我尝试运行上述查询时,它运行得非常慢。 EXPLAIN 查询显示,当我已经添加了 product_id 字段时,没有索引,因此查询需要 20 分钟到 30 分钟的任何时间才能返回一行。
我的完整 EXPLAIN 结果是:
| id | select_type | table | type | possible_keys| key | key_len | ref | rows | Extra |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
| 1 | SIMPLE | table | ALL | NULL | NULL | NULL | NULL |157211 | Using where |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
请注意,我刚刚查看了一下,ID 字段存储为 INT,而 PRODUCT_ID 字段存储为 VARCHAR,这可能会有所帮助。这可能是问题的根源吗?
【问题讨论】:
-
您能发布完整的
EXPLAIN结果吗?你确定没有没有索引吗?还是索引在那里,但 MySQL 选择不使用它? -
一个大表将有 150,000,000 条记录。一个非常大的表有 15,000,000,000 条记录。一个平均大小的表有 150,000 个。供将来参考。
-
请注意,'OR' 可以使 MySql 不使用索引。我有 3 个 OR 的查询。每个都匹配一个索引,并在 15 毫秒内运行,总共花费了 25 秒到超时。所以我做了 3 个查询并将它们联合起来,500.000 行也花了 15 毫秒。
-
考虑您存储的数据类型。性能可能会根据您比较的数据类型而变化。正如您所说的 PRODUCT_ID 是 VARCHAR 数据类型,请尝试将其更改为 INT 并索引该列。
标签: mysql optimization indexing row