MySQL使用索引进行搜索

时间:2013-10-10 22:15:04

标签: mysql sql

我最近发现了如何从EXPLAIN为SQL提供的信息中获益,我想我应该通过EXPLAIN子句运行所有查询,看看我是否有未经优化的东西。原来我有,我不知道该怎么做..

如果我解释此查询

SELECT `id`,`username`,`first_name`,`last_name` 
FROM `users` 
WHERE (`username` LIKE '%kelon%' 
  OR `email` LIKE '%kelon%' 
  OR `first_name` LIKE '%kelon%' 
  OR `last_name` LIKE '%kelon%' 
  OR `facebook` LIKE '%kelon%' 
  OR `twitter` LIKE '%kelon%' 
  OR `skype` LIKE '%kelon%')

我为ALL得到type,这显然是最糟糕的情况,即使我在所有列上都有索引,我也会NULL获得possible_keys。如何优化这个混乱的查询,以便在几百万条记录的情况下mysql不会逃跑?

1 个答案:

答案 0 :(得分:1)

在我看来,答案可能是拥有FULLTEXT索引。

但是考虑到你的桌子目前是InnoDB,你的托管服务提供商目前支持MySQL版本5.5,我只能想到这些选项:

  • 将该表格切换为MyISAM
  • 查看外部全文搜索引擎是否可选:LuceneSphinxXapian等。
  • 更改为支持MySQL 5.6.4或更高版本的托管服务提供商
  • 等待您的托管服务提供商将MySQL升级到5.6.4或更高版本

您也可以尝试这一点,看看它是否有任何好处:

SELECT `id`,`username`,`first_name`,`last_name` 
FROM `users` 
WHERE (
        `username` LIKE 'kelon%' 
    OR  `email` LIKE 'kelon%' 
    OR  `first_name` LIKE 'kelon%' 
    OR  `last_name` LIKE 'kelon%' 
    OR  `facebook` LIKE 'kelon%' 
    OR  `twitter` LIKE 'kelon%' 
    OR  `skype` LIKE 'kelon%'

    OR  `username` LIKE '%kelon%' 
    OR  `email` LIKE '%kelon%' 
    OR  `first_name` LIKE '%kelon%' 
    OR  `last_name` LIKE '%kelon%' 
    OR  `facebook` LIKE '%kelon%' 
    OR  `twitter` LIKE '%kelon%' 
    OR  `skype` LIKE '%kelon%'
)

链接:
What to do with MySQL Full Text Search while migrating to Innodb ?
What are the main differences between InnoDB and MyISAM ?