【问题标题】:Indexes and Primary Keys索引和主键
【发布时间】:2012-01-25 09:20:37
【问题描述】:

我的问题是关于索引和主键的。

假设我们有一个这样的表:

demo_table

| id                   | int(11)      | NO   | PRI |         |
| subject              | varchar(255) | YES  |     | NULL    |
| body                 | text         | YES  |     | NULL    |
| to                   | varchar(255) | YES  | MUL | NULL    |
| from                 | varchar(255) | YES  | MUL | NULL    |
| media                | varchar(255) | YES  |     | NULL    |

我有一个查询要查找特定“to”/“media”对的最后一行:

select * from demo_table where to="" and media="" order by id desc limit 0,1;

我想为我的表创建一个索引。我应该这样创建索引:

CREATE INDEX to_media on demo_table(media,to);

或者像这样:

CREATE INDEX to_media on demo_table(id,media,to);

看到ID排序了吗?

【问题讨论】:

  • 你的问题是什么,你的问题是什么?
  • 是 MyISAM 还是 InnoDB 表?在 InnoDB 中,PK 始终是索引中的第一列,即使您没有指定它。
  • 您应该警惕这么多允许空值的列。索引 VARCHAR(255) 列不一定是一个好主意(尽管它并不总是一个坏主意)。你会得到查询优化器使用的 3 部分索引吗?我不相信你会。您可能会使用 2 部分索引,但我不确定您是否会使用足够的索引来保证它的存在。
  • 思路是避免使用表对结果进行排序,所以只会使用带id键的索引,而不是索引+主键。

标签: mysql indexing primary-key


【解决方案1】:
CREATE INDEX to_media on demo_table(id,media,to);

【讨论】:

  • 它是 innodb 表。我的问题是知道我在问题中提出的两种类型的索引之间是否存在差异。仅供参考:在我的情况下,有超过 100000 行需要检查。
  • 这取决于...如果它的规模很大并且更多的插入/更新语句适用于 Innodb,否则选择 MYSAM
【解决方案2】:

这取决于... 如果它的大规模和更多的插入/更新语句适用于 Innodb,否则选择 MYSAM

请参阅链接以获得进一步说明

http://blogs.innodb.com/wp/2011/07/difference-between-innodb-fts-and-myisam-fts/

http://tapos.wordpress.com/2008/01/10/difference-between-innodb-and-myisam/

【讨论】:

    猜你喜欢
    • 2010-10-02
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多