如何针对LIKE'%abc%'查询优化包含1600多万条记录的MySQL表

Jos*_*osh 4 mysql sql optimization

我有一个这种结构的表,它目前包含约160万条记录.

CREATE TABLE `chatindex` (
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `roomname` varchar(90) COLLATE utf8_bin NOT NULL,
    `username` varchar(60) COLLATE utf8_bin NOT NULL,
    `filecount` int(10) unsigned NOT NULL,
    `connection` int(2) unsigned NOT NULL,
    `primaryip` int(10) unsigned NOT NULL,
    `primaryport` int(2) unsigned NOT NULL,
    `rank` int(1) NOT NULL,
    `hashcode` varchar(12) COLLATE utf8_bin NOT NULL,
    PRIMARY KEY (`timestamp`,`roomname`,`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Run Code Online (Sandbox Code Playgroud)

房间名称和用户名列都可以包含相同的确切数据,但每个项目的唯一性和重要位来自于将时间戳与这两个项目组合在一起.

开始需要一段时间(10-20秒)的查询是这样的:

SELECT timestamp,roomname,username,primaryip,primaryport 
    FROM `chatindex`
    WHERE username LIKE '%partialusername%'
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能优化这个?我不能这样做,partialusername%因为对于某些查询,我只会有一小部分实际用户名的中心,而不是实际值开头的前几个字符.

编辑:

另外,对于这个特殊目的,狮身人面像会更好吗?

Moy*_*ari 5

使用全文索引,这些索引实际上是为此目的而设计的.现在InnoDb支持MySQL 5.6.4中的全文索引.