假设我有这个样本表:
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`) );
基本上,“标签”列只是为用户设置的关键词
现在我要做的是能够根据名称和标签搜索用户 要进行快速搜索,我必须在“name”和“tags”上创建索引
所以我应该创建索引:
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) ;
答案 0 :(得分:1)
只要您的查询过滤name, tags
和names
,拥有单个索引(tags
)应该会更好。如果您的查询应省略tags
,则索引将无用(示例1下的最后一条语句)。另外,我希望您在tags
字段中没有多个“标记”。
示例1 - 综合指数
索引:INDEX (name, tags)
索引将用于SELECT ... WHERE name = '...' AND tags = '...'
或 SELECT ... WHERE tags = '...' AND name = '...'
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA | -------------------------------------------------------------------------------------------------------- | 1 | SIMPLE | users | ref | INDEX | INDEX | 1536 | const,const | 1 | Using where |
索引将用于SELECT ... WHERE name = '...'
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA | -------------------------------------------------------------------------------------------------- | 1 | SIMPLE | users | ref | INDEX | INDEX | 768 | const | 1 | Using where |用于
SELECT ... WHERE tags = '...'
的否索引
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA | ---------------------------------------------------------------------------------------------------- | 1 | SIMPLE | users | ALL | (null) | (null) | (null) | (null) | 1 | Using where |
示例2 - 两个单一索引
索引:INDEX1 (name)
,INDEX2 (tags)
两个索引都用于SELECT ... WHERE name = '...' AND tags = '...'
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA | --------------------------------------------------------------------------------------------------- | 1 | SIMPLE | users | ref | INDEX1,INDEX2 | INDEX1 | 768 | const | 1 | Using where |
INDEX1
用于SELECT ... WHERE tags = '...'
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA | --------------------------------------------------------------------------------------------------- | 1 | SIMPLE | users | ref | INDEX1 | INDEX1 | 768 | const | 1 | Using where |
INDEX2
用于SELECT ... WHERE name = '...'
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA | --------------------------------------------------------------------------------------------------- | 1 | SIMPLE | users | ref | INDEX2 | INDEX2 | 768 | const | 1 | Using where |
答案 1 :(得分:0)
首先,它将是第一个同时创建名称和标签索引的定义。
其次,我怀疑这是否会改进搜索,因为标签似乎包含多个带有一些分隔符/分隔符的值,如果它被规范化为一个单独的表user_tags
,users
之间具有一对多的关系{1}}和user_tags
,然后在(user_id, tag)
列上创建索引会有所帮助。然后users
表中的索引将只在name
列上。