我有一个大型的MyISAM表,其中包含大约200,000,000行数据,这些数据表示可以通过Web UI进行搜索的事件。用户界面是“高级搜索”类别的页面,因此用户可以为任何可搜索字段组合输入搜索条件。
表结构的简化版本是这样的:
events
event_id, event_code, place_id, person_id, date, type
people
person_id, person_name
允许用户使用必需的类型,可选的日期范围以及零个或多个event_codes,place_ids和/或person_names进行搜索。
为了优化此类搜索的表,我是否需要对列的每个排列都有一个索引,除了那些不包含类型的列?或者是否有更有效的方法来索引表。
目前,该表有一个主索引,涵盖event_code,place_id,person_id,日期和类型,因此当您使用所有字段进行搜索时,响应是可接受的。但是,如果您尝试使用例如只有日期范围,查询基本上永远不会返回。
答案 0 :(得分:0)
MySQL使用从第一个字段到最后一个字段的索引,因此如果您不使用索引中的早期字段,则不会使用索引(如您在日期中观察到的那样)。
我不一定会说你需要每个排列的索引,但至少有几个。既然您已经声明了类型是必需的,我会用它启动索引并创建一个相对较小的初始集合,两个字段索引,其他每个可搜索字段都是第二个字段。
同样非常重要的是你如何形成实际的搜索条件。如果您对索引字段(例如DAYOFWEEK(date)
)进行操作,则任何数量的索引都无济于事。