优化查询很多字段mysql

时间:2015-06-05 14:38:56

标签: mysql query-optimization

我对如何为我的桌子选择最佳索引感到困惑:

有这张桌子:

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
);

这是完整定义

1 个答案:

答案 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