0

假设我有这个示例表:

CREATE  TABLE `users` (
   `id` INT NOT NULL AUTO_INCREMENT ,
   `name` VARCHAR(512) NULL ,
   `lastname` VARCHAR(512) NULL ,
   `country` VARCHAR(256) NULL ,
   `tags` VARCHAR(512) NULL ,
PRIMARY KEY (`id`) );

基本上“标签”列只是为用户设置的关键词

现在我想做的是能够根据名称和标签搜索用户 为了快速搜索,我必须在“名称”“标签”上创建一个索引

所以要创建索引我应该这样做:

ALTER TABLE `vidhucr1_serverlist`.`new_table` 
ADD INDEX `INDEX` (`name` ASC, `tags` ASC) ;

或者

ALTER TABLE `vidhucr1_serverlist`.`new_table` 
ADD INDEX `INDEX1` (`name` ASC) 
, ADD INDEX `INDEX2` (`tags` ASC) ;
4

2 回答 2

1

只要name, tags您的查询过滤器namestags. 如果您的查询应该省略tags,则索引将无用(示例 1 下的最后一条语句)。tags另外,我希望您在该领域没有多个“标签” 。

示例 1 - 综合指数

索引:INDEX (name, tags)

索引将用于SELECT ... WHERE name = '...' AND tags = '...' SELECT ... WHERE tags = '...' AND name = '...'

| 身份证 | 选择类型 | 表 | 类型 | 可能键 | 关键 | KEY_LEN | 参考 | 行 | 额外 |
-------------------------------------------------- -------------------------------------------------- ----
| 1 | 简单 | 用户 | 参考 | 索引 | 索引 | 第1536章 常量,常量 | 1 | 使用位置 |

索引将用于SELECT ... WHERE name = '...'

| 身份证 | 选择类型 | 表 | 类型 | 可能键 | 关键 | KEY_LEN | 参考 | 行 | 额外 |
-------------------------------------------------- ------------------------------------------------
| 1 | 简单 | 用户 | 参考 | 索引 | 索引 | 第768章 常量 | 1 | 使用位置 |

没有使用索引SELECT ... WHERE tags = '...'

| 身份证 | 选择类型 | 表 | 类型 | 可能键 | 关键 | KEY_LEN | 参考 | 行 | 额外 |
-------------------------------------------------- --------------------------------------------------
| 1 | 简单 | 用户 | 全部 | (空) | (空) | (空) | (空) | 1 | 使用位置 |

示例 2 - 两个单一索引

索引:INDEX1 (name),INDEX2 (tags)

两个索引都用于SELECT ... WHERE name = '...' AND tags = '...'

| 身份证 | 选择类型 | 表 | 类型 | 可能键 | 关键 | KEY_LEN | 参考 | 行 | 额外 |
-------------------------------------------------- -------------------------------------------------
| 1 | 简单 | 用户 | 参考 | 索引1,索引2 | 索引1 | 第768章 常量 | 1 | 使用位置 |

INDEX1用于SELECT ... WHERE tags = '...'

| 身份证 | 选择类型 | 表 | 类型 | 可能键 | 关键 | KEY_LEN | 参考 | 行 | 额外 |
-------------------------------------------------- -------------------------------------------------
| 1 | 简单 | 用户 | 参考 | 索引1 | 索引1 | 第768章 常量 | 1 | 使用位置 |

INDEX2用于SELECT ... WHERE name = '...'

| 身份证 | 选择类型 | 表 | 类型 | 可能键 | 关键 | KEY_LEN | 参考 | 行 | 额外 |
-------------------------------------------------- -------------------------------------------------
| 1 | 简单 | 用户 | 参考 | 索引2 | 索引2 | 第768章 常量 | 1 | 使用位置 |
于 2012-12-10T02:20:59.603 回答
0

首先,它将是第一个同时创建名称和标签索引的定义。

其次,我怀疑这是否会改善搜索,因为标签似乎包含带有一些分隔符/分隔符的多个值,并且如果它被规范化为一个单独的表,并且在和user_tags之间具有一对多关系,那么在列上创建索引将帮助。那么表中的索引将只是在列上。usersuser_tags(user_id, tag)usersname

于 2012-12-10T02:20:27.890 回答