在mysql中设置INDEX以获得更好的搜索

时间:2012-12-10 02:15:07

标签: mysql indexing

假设我有这个样本表:

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

2 个答案:

答案 0 :(得分:1)

只要您的查询过滤name, tagsnames,拥有单个索引(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_tagsusers之间具有一对多的关系{1}}和user_tags,然后在(user_id, tag)列上创建索引会有所帮助。然后users表中的索引将只在name列上。