【发布时间】:2011-09-17 08:17:21
【问题描述】:
我正在尝试提高现有 MySQL 数据库的性能。
这是一个关于餐馆的数据库,有两个相关的表:
网站的所有实体都有一个表格,每个实体都有一个唯一的 id, 实体几乎可以是任何东西,它可以是餐厅、用户和许多其他事物。 实体类型有好几种,对于餐馆,它们的实体类型是“对象”。
我还要说,数据库的这种结构几乎是存在的 所以我不想做大的改变,我不会删除所有实体的表 例如。 (数据库本身没有数据,但是 PHP 引擎是内置的,所以它会 很难对结构进行大的改动)。
还有一个只用于对象的表,有几种类型 该数据库中的对象,但特别是餐馆 搜索很多,因为这是网站的主题, 餐馆有几个字段:国家、城市、名称、流派。 同一个城市和国家不可能有两家同名的餐厅, (例如可以有两家同名但在不同城市的餐厅 同一个国家或两个同名但在不同国家的城市)
所以从这个事实来看,我想我应该为国家、城市和名称列创建一个唯一的三列索引。
另外我想说的是,URL也是以www.domain.com/Country/City/Restuarant-Name的形式构建的,所以country-city-name的组合应该是快速获取和这种类型的查询会发生很多事情。
但也会有很多其他类型的查询,例如:搜索名称 餐厅(使用 LIKE 查询,因为搜索的名称可以是一部分 全名)在某个城市,或者在某个国家。 搜索某个国家和城市中某种类型的所有餐厅。 以及几乎所有可能的组合。
最常用的查询可能是 (a) 在某个城市搜索餐厅名称 和国家(这将与键入 URL 时使用的查询相同,但将使用 LIKE), (b) 在某个城市和国家搜索某种类型的餐馆。 最后(c)在全球范围内搜索餐厅名称(在整个数据库中,不指定城市和国家)
此表(对象表)当前具有 PRIMARY KEY,即对象的 ID, 该ID也被大量使用,最佳做法如下?:
- 根据国家、城市、名称创建一个三列的唯一索引
- 从名称中创建另一个(非唯一)索引(所以我写了一个 c 类型的查询 以上将快速执行)
- 可能会制作某种子表,其中仅包含对象中的餐馆 表,因此将查询此子表。 (这不太重要,因为如果我决定 为了做出重大改变,我可能会将餐厅与对象的其余部分分开 开始)
我非常感谢任何帮助,因为我已经尝试了很长时间来决定这个问题。
p.s 在对象表中的一些对象不会有任何类型或任何国家或城市, 所以它们将保持为 NULL,我知道 UNIQUE KEY 中允许使用 NULL 值,但它会 对性能有影响吗?
感谢任何愿意阅读这个长问题的人:)
【问题讨论】:
-
@Denis 感谢您的链接。对于性能,索引是关键。双关语。
标签: mysql indexing multiple-columns