代码之家  ›  专栏  ›  技术社区  ›  Edamame

索引mysql表(网格搜索)

  •  0
  • Edamame  · 技术社区  · 6 年前

    my_table ,其中包含以下列:

    start_cell, end_cell, field_1, field_2, field_3 ..., field_n
    

    select * from my_table where start_cell = 'cell_1234' and end_cell = 'cell_5678'
    

    start_cell end_cell 都来自 cell_1 cell_9000

    我做了以下索引以加快搜索速度:

    alter table my_table add index(start_cell)
    

    到目前为止效果还不错。但是,我想知道是否有更好的索引方法来解决这个问题?谢谢!

    2 回复  |  直到 6 年前
        1
  •  1
  •   Barmar    6 年前

    如果您通常测试查询中的两列,那么应该创建多列索引。

    ALTER TABLE my_table ADD INDEX (start_cell, end_cell);
    

    这个索引对于只测试 start_cell ,因为多列索引也是索引的任何前缀的索引(这是B树索引的自然结果)。

    end_cell 启动单元格 ,可以添加第二个索引:

    ALTER TABLE my_table ADD INDEX (end_cell);
    
        2
  •  0
  •   Guy Louzon    6 年前

    问题有点宽泛,您应该考虑起始单元格和结束单元格的字段类型 除了简单的 select * 使用join或group by 索引有时可能更有用,如果它组合了多个字段,尽管情况似乎并非如此

    通常,检查正确索引的最佳方法是使用explain select,即:

    EXPLAIN select * from my_table where start_cell = 'cell_1234' and end_cell = 'cell_5678'
    

    它将向您展示查询的弱点,并能为您指出最佳方法 MySQL explain select