快速字符串匹配MySQL查询
我有一个MySQL数据库(InnoDB),表users
有一个username
名列。 在Ruby on Rails网站上,我有一项function,允许用户通过用户名搜索某人。 在打字时,网站会建议用户搜索的是谁(预先输入w / bootstrap)。 目前我在MySQL中使用查询, SELECT `username` FROM users WHERE `username` LIKE 'the_query%' LIMIT 15;
存在的问题是速度。 该表有大约500,000行,这样的查询似乎需要大约秒,这在飞行中产生猜测时太慢了。 我该怎么做才能提高性能? 不到100毫秒的东西是合适的。 也许有比使用MySQL处理搜索更好的方法呢?
- 在用户表中创建索引以获得快速结果(这将有助于更快地提供结果)。
- 确保用户在输入某个字符后获得结果(不仅仅是单字符搜索)。
如果你只是从username
字符串的开头搜索,那么匹配子字符串可能会更快: SELECT `username` FROM users WHERE SUBSTRING(`username`, 0, CHAR_LENGTH('the_query'))='the_query';
尽量限制你获得的匹配数量。 如果是搜索栏,则无法在搜索列表中显示数千条记录。 但是从上面的查询中,服务器将所有结果发送到前端,我猜。 然后你可以过滤掉那些记录。 除此之外,请尝试此查询。
将记录数限制为10 …
SELECT username
FROM users WHERE username
LIKE’the_query%’LIMIT 10;
结束了FULLTEXT
在用户名栏中提到的FULLTEXT
索引(之前只有一个独特的索引),这似乎加速了10倍。 查询大约需要90到120毫秒。
如果您从用户名+密码创建md5哈希,它会更快。 因为每行的长度总是32个字符,所以您可以在此字段上设置索引,并在索引字段上使用非常快速的搜索。
- Mysql结果按列表排序,每个用户都是唯一的
- 如何将数据从ASCII(ISO / IEC 8859-1)导入到我的Rails / PGSQL数据库?
- 使用rake db:migrate命令和mysql在Rails中创建表的PRIMARY KEY问题
- RoR:不能在postgres中更改_column,在MySQL中可以很好(MySQL用于开发,Postgres在Heroku上)
- 列出特定日期的可用用户
- 如何根据查询插入多行?
- 耙子流产了! 无法在El Capitan上加载这样的文件 – mysql2 / mysql2
- 使用LDAP / AD登录身份validation时如果使用AD记录不存在用户行,如何创建用户行
- 如果超过24小时,Mysql“Time”类型在Rails中给出“ArgumentError:参数超出范围”