强制使用多个索引--mysql

时间:2014-05-09 14:36:09

标签: mysql indexing

我正在尝试让这个查询使用我创建的索引,但它仍在进行全表扫描。我甚至试图创建一个多字段索引,但不是运气。我尝试了FORCE INDEX,但也没有运气。

Places表有150万条记录。查询的目的是让它沿着街道按正确的顺序对地点进行排序。

SELECT PlacesId 
FROM Places FORCE INDEX (Streetname, StreetType, PreDirection,  
PostDirection, HouseNumber, UnitNumber) 
WHERE Type='Physical' 
ORDER BY StreetName, StreetType, PreDirection, PostDirection, HouseNumber, UnitNumber;

解释输出

{
  "query_block": {
    "select_id": 1,
    "ordering_operation": {
      "using_filesort": true,
      "table": {
        "table_name": "Places",
        "access_type": "ALL",
        "rows": 1519419,
        "filtered": 100,
        "attached_condition": "(`importready`.`Places`.`Type` = 'Physical')"
      }
    }
  }
}

我考虑过为列创建哈希,但我认为不会让我到那里。

我可以将街道特定字段(PreDirection,StreetName,StreetType,PostDirection)组合在一起吗?

物理的总行数为1,376,984

Table   Non_unique  Key_name    Seq_in_index    Column_name Collation   Cardinality Sub_part    Packed  Null    Index_type  Comment Index_comment
Places  0   PRIMARY 1   PlacesId    A   1519419 NULL    NULL        BTREE       
Places  1   PartAddress 1   Address1    A   1519419 25  NULL    YES BTREE       
Places  1   City    1   City    A   4763    15  NULL    YES BTREE       
Places  1   Zip 1   ZipCode A   1116    5   NULL    YES BTREE       
Places  1   HouseNumber 1   HouseNumber A   138129  NULL    NULL    YES BTREE       
Places  1   UnitNumber  1   UnitNumber  A   27625   NULL    NULL    YES BTREE       
Places  1   PostDirection   1   PostDirection   A   20  NULL    NULL    YES BTREE       
Places  1   PreDirection    1   PreDirection    A   20  NULL    NULL    YES BTREE       
Places  1   StreetType  1   StreetType  A   96  NULL    NULL    YES BTREE       
Places  1   StreetName  1   StreetName  A   56274   NULL    NULL    YES BTREE       
Places  1   Precinct    1   Precinct    A   1327    NULL    NULL    YES BTREE       
Places  1   County  1   County  A   72  NULL    NULL    YES BTREE       
Places  1   SortOrder   1   StreetName  A   46043   20  NULL    YES BTREE       
Places  1   SortOrder   2   StreetType  A   75970   5   NULL    YES BTREE       
Places  1   SortOrder   3   PreDirection    A   94963   6   NULL    YES BTREE       
Places  1   SortOrder   4   PostDirection   A   108529  6   NULL    YES BTREE       
Places  1   SortOrder   5   HouseNumber A   1519419 NULL    NULL    YES BTREE       
Places  1   SortOrder   6   UnitNumber  A   1519419 5   NULL    YES BTREE   

标记

1 个答案:

答案 0 :(得分:0)

来自Mysql文档: 在某些情况下,MySQL可以使用索引来满足ORDER BY子句,而无需进行任何额外的排序。

即使ORDER BY与索引不完全匹配,也可以使用索引,只要索引的所有未使用部分和所有额外的ORDER BY列都是WHERE子句中的常量

索引中缺少的是字段类型(在索引的开头)。