Mysql 使用预定义关键字创建表架构
我正在创建一个需要优化的表模式,原因是表将有300万到500万条记录。这里最大的问题是关于搜索,在这种情况下,著名的像%%。。。不是选项,为了避免这种情况,在每次插入时,将基于主字段创建3个关键字作为某物的名称,例如: 虚拟表格“cities”,包含以下列Mysql 使用预定义关键字创建表架构,mysql,sql,Mysql,Sql,我正在创建一个需要优化的表模式,原因是表将有300万到500万条记录。这里最大的问题是关于搜索,在这种情况下,著名的像%%。。。不是选项,为了避免这种情况,在每次插入时,将基于主字段创建3个关键字作为某物的名称,例如: 虚拟表格“cities”,包含以下列 id | name | visibility | key_1 | key_2 | key_3 让我们以记录的形式进入纽约市,在这个例子中,我们将有两个词 key_1 = new key_2 = york 这样,在一个包含数百万条记录的表中
id | name | visibility | key_1 | key_2 | key_3
让我们以记录的形式进入纽约市,在这个例子中,我们将有两个词
key_1 = new
key_2 = york
这样,在一个包含数百万条记录的表中进行搜索的结果如下所示:
select name from cities
where visibility = 1
and(
key_1 = 'new' or
key_1 = 'york' or
key_2 = 'new' or
key_2 = 'york'
);
问题是:它会比全文或像%%这样的通配符更快吗?这是一种好的做法吗
我见过大公司使用这种技术,但是,我想听听你的意见
提前谢谢你 查询中的小更正:
select name from cities
where visibility = 1
and 'new' in (key1, key2)
and 'york' in (key1, key2) ;
查询中的小更正:
select name from cities
where visibility = 1
and 'new' in (key1, key2)
and 'york' in (key1, key2) ;
如果您想要性能,您需要一个名为
CityKeys
的表,每个城市一行,每个键一行
然后,您可以将查询编写为:
select c.name
from cities c
where c.visibility = 1 and
exists (select 1 from citykeys ck where ck.cityid = c.cityid and ck.key = 'new') and
exists (select 1 from citykeys ck where ck.cityid = c.cityid and ck.key = 'york') ;
如果键的顺序很重要,那么可以在逻辑中包含keynumber
列
然后可以利用
citykeys(cityid,key)
上的索引。如果需要性能,需要一个名为citykeys
的表,每个城市一行,每个键一行
然后,您可以将查询编写为:
select c.name
from cities c
where c.visibility = 1 and
exists (select 1 from citykeys ck where ck.cityid = c.cityid and ck.key = 'new') and
exists (select 1 from citykeys ck where ck.cityid = c.cityid and ck.key = 'york') ;
如果键的顺序很重要,那么可以在逻辑中包含keynumber
列
这可以利用
citykeys(cityid,key)
列而非字段上的索引。@jarlh谢谢,我英语说得不好列,而非字段。@jarlh谢谢,我英语说得不好非常感谢,但你认为这种方式对搜索性能有什么好处?非常感谢,但您认为这种方式对搜索性能有什么好处?