我正在尝试提高现有 MySQL 数据库的性能。
这是一个关于餐馆的数据库,有两个相关的表:
网站的所有实体都有一个表格,每个实体都有一个唯一的 id,一个实体几乎可以是任何东西,它可以是餐厅、用户和许多其他东西。有几种实体类型,对于餐馆,它们的实体类型是“对象”。
我还要说,数据库的这种结构几乎已经存在,所以我不想做大的改变,例如,我不会删除所有实体的表。(数据库本身没有数据,但是 PHP 引擎是构建的,因此很难对结构进行大的更改)。
还有一个仅用于对象的表,该数据库中有几种类型的对象,但是由于这是网站的主题,因此专门针对餐馆将进行大量搜索,餐馆有多个字段:国家,城市,名称,流派。在同一个城市和国家不能有两家同名的餐厅,(例如可以有两家同名但在同一个国家的不同城市,或者在两个同名但在同一个城市不同的国家)
所以从这个事实我想我应该为国家、城市和名称列创建一个唯一的三列索引。
另外我想说的是,URL也是以www.domain.com/Country/City/Restuarant-Name的形式构建的,所以country-city-name的组合应该被快速获取并且这种类型的查询会发生很多。
但也会有很多其他类型的查询,例如:在某个城市或某个特定城市搜索餐厅名称(使用 LIKE 查询,因为搜索的名称可以是全名的一部分)国家。搜索某个国家和城市中某种类型的所有餐厅。几乎所有可能的组合。
最常用的查询可能是 (a) 搜索某个城市和国家/地区的餐厅名称(这与键入 URL 时使用的查询相同,但将使用 LIKE),(b) 搜索某个城市和国家/地区的餐厅特定城市和国家的特定类型。最后(c)在全球范围内搜索餐厅名称(在整个数据库中,不指定城市和国家)
该表(对象表)当前具有PRIMARY KEY,即对象的ID,该ID也被大量使用,最佳做法如下?:
- 从国家、城市、名称中创建一个三列 UNIQUE 索引
- 从名称中创建另一个(非唯一)索引(因此我在上面编写的类型 c 的查询将被快速执行)
- 可能会从对象表中创建某种仅包含餐厅的子表,以便查询该子表。(这不那么重要,因为如果我决定做一个大的改变,我可能会把餐馆从对象的其余部分分开)
我真的很感激任何帮助,因为我长期以来一直试图决定这一点。
ps 对象表中的某些对象不会有任何类型或任何国家或城市,因此它们将保持为 NULL,我知道 UNIQUE KEY 中允许使用 NULL 值,但它会对性能产生影响吗?
非常感谢任何愿意阅读这个长问题的人:)