我对如何为我的桌子选择最佳索引感到困惑:
有这张桌子:
Hotel
-has_1
...
-has-5
-nota_AVG
-nota_1
-nota_2
-nota_3
和这个
Nota_hotel
-nota_1
-nota_2
-nota_3
-id_hotel
酒店名称为“nota_ *”的字段是从表Nota_hotel的触发器更新,此字段经常更改。
我需要做一些像
这样的查询select * from hotel where has_X = true or has_Y=true order by nota_Z
其中我的子句“WHERE”在查询中可以有1个has_X或多个has_ *字段取决于所选的复选框。
我想知道放置索引的最佳做法是什么,为每个字段添加“nota_”索引,为字段“has_”创建单个索引(has_1,...,has_5)或为每个字段添加“has_”一个索引,如果有这么多索引可以扼杀我的MySQL服务器?
create table hotel(
id int primary key auto_increment,
nume varchar(255),
index hotel_nume_index(nume),
nume_oras varchar(100),
nume_zona varchar(100),
nume_tara varchar(100),
foreign key (nume_oras,nume_zona,nume_tara) references oras(nume,nume_zona,nume_tara) ON DELETE CASCADE,
descriere text,
stele int,
map_x double,
map_y double,
has_sauna TINYINT(1),
has_piscina TINYINT(1),
has_parcare TINYINT(1),
has_restaurant TINYINT(1),
has_fitness TINYINT(1),
distanta_obiectiv double,
code_api1 varchar(255),
code_api2 varchar(255),
code_api3 varchar(255),
intern TINYINT(1),
nota_hotel double,
nota_restaurant double,
nota_locatie double,
nota_conditii double,
nume_comision varchar(100),
foreign key (nume_comision) references comision(nume)
);
create table nota_hotel(
fb_id varchar(100),
data DATETIME,
nota_restaurant double,
nota_locatie double,
nota_conditi double,
comentariu text,
nume_user varchar(255),
id_hotel int,
foreign key (id_hotel) references hotel(id) ON DELETE CASCADE
);
这是完整定义
答案 0 :(得分:1)
这是一项正在进行的工作答案。将加入它。
假设您有5个has_列,例如has_restaurant,has_pool,has_pool,并且搜索类似于之前的真实类型,就像'确实它有一个池'一样
对于初学者,使用2的幂将它们转换为一列。让我们称之为hasX
,其列值是下面的一个按位OR(不是列)
has_restaurant (2^0) 1
has_pool (2^1) 2
has_wifi (2^2) 4
has_piscina (2^3) 8
has_sauna (2^4) 16
所以如果酒店有wifi和桑拿,那么hasX列将包含(至少)打开的值为20的位,但可以包含值21(也有餐馆)。但搜索的是“我想要无线和桑拿”所以它也找到了21。它是mask
所以此时我们在列hasX
编辑 我只是轰炸了这个概念,因为我认为我可以制作一个有点明智的搜索,而且在阅读之后这似乎是不可能的。以下似乎是最好的后续工作
CREATE TABLE hotel (
hotel_id int primary key auto_increment PRIMARY KEY,
/* some more fields... */
);
CREATE TABLE hotel_flags (
flag_id TINYINT UNSIGNED NOT NULL
, description VARCHAR(100) NOT NULL
, PRIMARY KEY (flag_id)
);
**the following is the intersect table**
CREATE TABLE hotel_flags_intersect (
hotel_id int not null
, flag_id TINYINT UNSIGNED NOT NULL
, PRIMARY KEY (hotel_id, flag_id)
, UNIQUE INDEX reverse_pk (flag_id, hotel_id)
);
谦卑地借鉴了http://forums.mysql.com/read.php?24,35318,35640#msg-35640