【问题标题】:Single index in Alter table wont get added if its part of a multi column index如果 Alter 表中的单个索引是多列索引的一部分,则不会添加它
【发布时间】:2020-01-28 00:59:49
【问题描述】:

到目前为止,我在存储过程中有这个:

IF NOT EXISTS(SELECT 1 FROM information_schema.statistics WHERE TABLE_SCHEMA=DATABASE()
        AND TABLE_NAME= 'food'  AND (INDEX_NAME='ix_meat' OR COLUMN_NAME='meat')
    )
THEN
    CREATE INDEX ix_meat ON food (meat);
END IF; 


IF NOT EXISTS(SELECT 1 FROM information_schema.statistics WHERE TABLE_SCHEMA=DATABASE()
        AND TABLE_NAME= 'food'  AND (INDEX_NAME='ix_greens' OR COLUMN_NAME='greens')
    )
THEN
    CREATE INDEX ix_greens ON food(greens);
END IF; 

food 中除 primary 之外的其余列是:

水果、份量、性别、重量

如果这些列上没有单个索引,或者它们中的任何一个是多列索引的一部分但在右侧(如(性别,绿色)),我只想添加一个索引。为了确保不存在单列索引,我需要对该列进行行计数检查。我该如何修改这个脚本来做到这一点?

【问题讨论】:

  • 我不明白这个问题。您的查询不区分单列和多列索引。它只是检查该列是否在任何索引中。
  • 请注意,您希望只测试 greens 的查询使用索引,它必须是索引中的第一列。所以你应该检查seq_in_index = 1
  • 是的,这是我关于如何区分单列和多列索引的问题,现在我只检查任何一个。我尝试了几件事,但它们没有工作。
  • 既然已经有单列​​索引,为什么还要添加索引?
  • 绝对不允许这样。如果该列上没有单个索引,或者该列是多列索引的一部分但位于右侧,例如(性别,绿色),我只想添加一个索引

标签: mysql indexing alter-table


【解决方案1】:

使用seq_in_index 列来判断该列在索引中的位置。您想要添加索引,除非它是索引中的第一列。

IF NOT EXISTS(SELECT 1 FROM information_schema.statistics WHERE TABLE_SCHEMA=DATABASE()
        AND TABLE_NAME= 'food'  AND (INDEX_NAME='ix_meat' OR (COLUMN_NAME='meat' AND SEQ_IN_INDEX = 1))
    )
THEN
    CREATE INDEX ix_meat ON food (meat);
END IF; 


IF NOT EXISTS(SELECT 1 FROM information_schema.statistics WHERE TABLE_SCHEMA=DATABASE()
        AND TABLE_NAME= 'food'  AND (INDEX_NAME='ix_greens' OR (COLUMN_NAME='greens' AND SEQ_IN_INDEX = 1))
    )
THEN
    CREATE INDEX ix_greens ON food(greens);
END IF; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多