MySQL索引,最多可以添加多少个?

3

我有三个字段:id,member_id和topic_id。 有时我在WHERE子句中使用id,有时使用member_id,有时使用topic_id。 我是否可以为它们全部添加索引? 这样做会使查询变慢吗? 我对MYSQL优化不太熟悉,谢谢。

2个回答

4

未使用的索引不会使 SELECT 操作变慢,但每添加一个索引都会减慢 INSERT 和 UPDATE 操作。

MyISAM 表可以拥有的最大索引数为 64。


它会显著地或仅略微地减慢INSERT和UPDATE吗?而且,我可以看出你擅长php/mysql,请在有时间的情况下检查这个问题:https://dev59.com/5U7Sa4cB1Zd3GeqP6LsE - good_evening
3
一般情况下,除非你要进行大规模的更新,否则不值得过于担心。如果要插入大量数据,可以暂时删除索引并在插入完成后重新构建索引。 - Paul Dixon
1
此外,您可以使用EXPLAIN来查找给定查询是否使用了您预期的索引,并且还可以帮助您发现需要新索引的情况。 - Paul Dixon
@PaulDixon,如果您使用批量事务,则INSERTsUPDATEs不会变慢。https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html-- 我通常用于INNODBSET AUTOCOMMIT = 0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0; -- 其中之一 -- REPLACE INTO () VALUES () UPDATE ON DUPLICATE; -- INSERT INTO () VALUES (); -- INSERT INTO (SELECT ... FROM ...); -- CREATE TABLE AS (); -- ALTER TABLE (); SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; COMMIT; SET AUTOCOMMIT = 1; - JayRizzo

2
通常情况下,如果您只会在单个字段上过滤查询,例如以下情况,您会希望在每个字段上都有一个单独的索引:
SELECT * FROM your_table WHERE id = ?;
SELECT * FROM your_table WHERE member_id = ?;
SELECT * FROM your_table WHERE topic_id = ?;

如果id字段是主键,那么它可能已经使用了聚集索引。因此,看起来您可能想尝试在member_idtopic_id上创建两个单独的非聚集索引
CREATE INDEX ix_your_table_member_id ON your_table (member_id);
CREATE INDEX ix_your_table_topic_id ON your_table (topic_id);

您可能也对研究覆盖索引这个主题感兴趣。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接