Mysql 2列索引与3列索引性能对比

Mysql 2列索引与3列索引性能对比,mysql,sql,performance,indexing,query-optimization,Mysql,Sql,Performance,Indexing,Query Optimization,背景: 假设我有一个名为mytable的表,其中包含以下列: ID(唯一) 用户id(字符串) 创建日期(日期) 已删除(布尔值) 。。。(更多不重要的栏目) 我的问题如下: SELECT * FROM mytable WHERE user_id = 'abcdefg1234567' AND creation_date BETWEEN '2018-01-01 10:00:00' AND '2019-01-01 10:00:00'; 我的问题: 这两个索引之间是否存在性能差异(在执行我的特定查询

背景:

假设我有一个名为mytable的表,其中包含以下列:

  • ID(唯一)

  • 用户id(字符串)

  • 创建日期(日期)

  • 已删除(布尔值)

  • 。。。(更多不重要的栏目)

  • 我的问题如下:

    SELECT * FROM mytable
    WHERE user_id = 'abcdefg1234567'
    AND creation_date BETWEEN '2018-01-01 10:00:00' AND '2019-01-01 10:00:00';
    
    我的问题:

    这两个索引之间是否存在性能差异(在执行我的特定查询时):

  • (用户id、创建日期)

  • (用户id、创建日期、已删除)

  • 我希望没有遗漏任何信息来回答这个问题


    多谢各位

    查询在
    user\u id
    creation\u date
    列上进行过滤。当然,在
    (用户id、创建日期)
    (您的问题中的选项1)上建立索引会有好处

    MySQL还可以利用
    (user\u id,creation\u date,deleted)
    上的索引,因为查询所需的列位于索引定义的第一位;如果它是
    (已删除,用户id,创建日期)
    ,则查询不会利用它


    因此,我不认为这两种设置之间存在显著的性能差异,在这两种情况下都应使用现有的指数;您可以通过生成每个语句的
    explain
    计划来确认这一点。

    查询筛选列
    user\u id
    creation\u date
    。当然,在
    (用户id、创建日期)
    (您的问题中的选项1)上建立索引会有好处

    MySQL还可以利用
    (user\u id,creation\u date,deleted)
    上的索引,因为查询所需的列位于索引定义的第一位;如果它是
    (已删除,用户id,创建日期)
    ,则查询不会利用它


    因此,我不认为这两种设置之间存在显著的性能差异,在这两种情况下都应使用现有的指数;您可以通过生成每个声明的
    解释计划来确认这一点。

    我不确定GMB的答案是否清楚。这两个索引都将用于查询。您不应该看到它们之间有任何性能差异。(实际上,第二个索引的开销可能会稍微多一点,因为它在物理上更大。)

    MySQL实际上在多列索引方面有很好的表现,这解释了它们是如何被使用的


    没有理由同时使用这两个索引。你只需要第二个,它将涵盖你查询的
    where
    子句。

    我不确定GMB的答案是否清楚。这两个索引都将用于查询。您不应该看到它们之间有任何性能差异。(实际上,第二个索引的开销可能会稍微多一点,因为它在物理上更大。)

    MySQL实际上在多列索引方面有很好的表现,这解释了它们是如何被使用的

    没有理由同时使用这两个索引。您可以简单地使用第二个,它将涵盖查询的
    where
    子句。

    我有一个名为mytable的表,下面的列替换为CREATE table(可能会跳过不必要的字段,但必须显示索引和表选项)。1.ID(唯一)真的不是主要的吗?如果使用索引(当然是单独使用的),这两个索引之间是否存在性能差异?90%的差异无法测量(小于测量精度),10%的差异根本不存在。我有一个名为mytable的表,下面的列替换为CREATE table(可能会跳过不必要的字段,但必须显示索引和表选项)。1.ID(唯一)确实不是主要的?如果使用索引(当然是单独使用),这两个索引之间是否存在性能差异?90%的差异无法测量(低于测量精度),10%的差异根本不存在。