【问题标题】:mysql index on column of int typeint类型列上的mysql索引
【发布时间】:2011-06-22 10:08:03
【问题描述】:

如果列是 int 类型,是否还需要对其进行索引以使 select 查询运行得更快?

SELECT * 
  FROM MyTable 
 WHERE intCol = 100;

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

    是的。列具有哪种数据类型并不重要。如果您不指定索引,则 mysql 必须在您使用该列搜索值时扫描整个表。

    【讨论】:

    【解决方案2】:

    是的,任何列上的索引都可以使查询执行得更快,而不管数据类型如何。数据本身很重要——如果系统中当前只有两个值,那么使用索引毫无意义。

    还要注意:

    • 索引的存在并不能确保它会被使用——表统计信息必须是最新的,但它确实取决于查询。
    • MySQL 也只允许每个 SELECT 一个索引,并且索引空间有限 (limit dependent on engine)。

    【讨论】:

    • "MySQL 也只允许每个 SELECT 一个索引,并且索引空间有限" -- 不?! (或者我只是误解了你。你想引用一些可能说明这一点的文件吗?)
    • @yankee:当您查看 EXPLAIN 计划时,MySQL 只能使用 EXPLAIN 看到的每个语句的一个索引。例如,子查询将是一个单独的 SELECT。
    • @OMG Ponies:子查询更难。但是有些东西,比如用“and”和“or”连接和wheres,并且可能有多个列涉及多个索引。
    • @yankee: JOINs, AND/OR... 仍然是一个查询。因此,复合索引(多列索引,带有警告)通常是一个考虑因素。
    • @OMG Ponies: select foo from bar left join foobar on (bar.x=foobar.y) where bar.z=123 如果所有 3 列都被索引,我说所有 3将使用索引。你有不同的看法吗?
    【解决方案3】:

    是的,索引的重点是您可以通过primary key 或手动添加索引来创建它们。列的类型并没有说明查询的速度。

    【讨论】:

      【解决方案4】:

      是的,它必须被索引。如果将 tinyint 列用作布尔值,则对它们进行索引是没有意义的,因为该索引的选择性不够。

      【讨论】:

        【解决方案5】:

        可能是的,除非

        • 表格的行数很少 (
        • int 列选择性差
        • 大部分表格被退回(例如 > 1%)

        在这种情况下,表扫描可能更有意义,优化器可能会选择这样做。在大多数情况下,无论如何拥有索引并不是很有害,但您绝对应该尝试并查看(在您的实验室中,在具有类似生产数据集的生产级硬件上)

        【讨论】:

        • 这听起来不太科学。我们可以索引字符串,因为逐字符验证肯定会花费更多时间,因此逐行进行操作是 O(n^m_i) 操作,其中 n 是行数,m_i 是每个字符的数量字符串 i。此外,如果我想查找一个整数,我可以对存储它们的列进行排序......如果我没记错的话,查找表是如何工作的?......请实际纠正我,如果我错了
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-02
        • 2018-10-02
        相关资源
        最近更新 更多