Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用预定义关键字创建表架构_Mysql_Sql - Fatal编程技术网

Mysql 使用预定义关键字创建表架构

Mysql 使用预定义关键字创建表架构,mysql,sql,Mysql,Sql,我正在创建一个需要优化的表模式,原因是表将有300万到500万条记录。这里最大的问题是关于搜索,在这种情况下,著名的像%%。。。不是选项,为了避免这种情况,在每次插入时,将基于主字段创建3个关键字作为某物的名称,例如: 虚拟表格“cities”,包含以下列 id | name | visibility | key_1 | key_2 | key_3 让我们以记录的形式进入纽约市,在这个例子中,我们将有两个词 key_1 = new key_2 = york 这样,在一个包含数百万条记录的表中

我正在创建一个需要优化的表模式,原因是表将有300万到500万条记录。这里最大的问题是关于搜索,在这种情况下,著名的像%%。。。不是选项,为了避免这种情况,在每次插入时,将基于主字段创建3个关键字作为某物的名称,例如:

虚拟表格“cities”,包含以下列

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谢谢,我英语说得不好非常感谢,但你认为这种方式对搜索性能有什么好处?非常感谢,但您认为这种方式对搜索性能有什么好处?