0

我最近发现了如何从 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%')

我得到ALLfor type,这显然是最坏的情况,即使我在所有列上都有索引,我也得到NULL了。possible_keys我怎样才能优化这个凌乱的查询,这样mysql就不会在几百万条记录的情况下跑掉?

4

1 回答 1

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%'
)

链接:
迁移到 Innodb 时如何处理 MySQL 全文搜索?
InnoDB 和 MyISAM 之间的主要区别是什么?

于 2013-10-10T23:28:50.020 回答