mysql查询耗时过长

标签 mysql

我是高级查询的新手,所以我可能在概念上有一些错误,因为当数据库有超过 100 万条记录时,我会从我的查询中得到这个响应......

错误 2013:查询期间与 MySQL 服务器失去连接

是的!它实际上需要很长时间才能完成。

我的查询是这样的...

SELECT users.username,
    table_1.field_abc, table_1.field_def,
    table_2.field_ghi, table_2.field_jkl
FROM users
LEFT JOIN table_1 ON table_1.username = users.username
LEFT JOIN table_2 ON table_2.username = users.username
WHERE
    table_1.field_abc REGEXP "(spork|yellow)" OR
    table_1.field_def REGEXP "(spork|yellow)" OR
    table_2.field_ghi REGEXP "(spork|yellow)" OR
    table_2.field_jkl REGEXP "(spork|yellow)"
GROUP BY users.username
ORDER BY
(
    ( CASE WHEN table_1.field_abc LIKE "%spork%" THEN 1 ELSE 0 END ) +
    ( CASE WHEN table_1.field_abc LIKE "%yellow%" THEN 1 ELSE 0 END ) +
    ( CASE WHEN table_1.field_def LIKE "%spork%" THEN 1 ELSE 0 END ) +
    ( CASE WHEN table_1.field_def LIKE "%yellow%" THEN 1 ELSE 0 END ) +
    ( CASE WHEN table_2.field_ghi LIKE "%spork%" THEN 1 ELSE 0 END ) +
    ( CASE WHEN table_2.field_ghi LIKE "%yellow%" THEN 1 ELSE 0 END ) +
    ( CASE WHEN table_2.field_jkl LIKE "%spork%" THEN 1 ELSE 0 END ) +
    ( CASE WHEN table_2.field_jkl LIKE "%yellow%" THEN 1 ELSE 0 END )
)DESC;

我在 http://sqlfiddle.com/#!2/cbbda/28 发布了一个示例数据集(只有几条记录)

sqlfiddle 上的示例运行速度很快,因为只有几条记录,但我尝试在我自己的服务器上复制记录,查询在只有几条记录的情况下运行很快,在我添加一百万条记录后运行速度非常慢。

有什么方法可以快速得到结果吗?

最佳答案

伙计们...在您的帮助下我们有一个解决方案...请参阅...http://sqlfiddle.com/#!2/fcfbd/5 但我仍然有一个问题...

我修改了表以添加索引...

ALTER TABLE  `users` ADD FULLTEXT ( `username` );
ALTER TABLE  `table_1` ADD FULLTEXT ( `field_abc`,`field_def` );
ALTER TABLE  `table_2` ADD FULLTEXT ( `field_ghi`,`field_jkl` );

然后我接受了@Barmar 的建议并将代码更改为...

SELECT users.username,
    table_1.field_abc, table_1.field_def,
    table_2.field_ghi, table_2.field_jkl
FROM users
LEFT JOIN table_1 ON table_1.username = users.username
LEFT JOIN table_2 ON table_2.username = users.username
WHERE
    MATCH(table_1.field_abc,table_1.field_def,table_2.field_ghi,table_2.field_jkl)
    AGAINST ("spork yellow" IN BOOLEAN MODE)
GROUP BY users.username
ORDER BY
(
    ( CASE WHEN MATCH(table_1.field_abc) AGAINST ("spork" IN BOOLEAN MODE) THEN 1 ELSE 0 END ) +
    ( CASE WHEN MATCH(table_1.field_abc) AGAINST ("yellow" IN BOOLEAN MODE) THEN 1 ELSE 0 END ) +

    ( CASE WHEN MATCH(table_1.field_def) AGAINST ("spork" IN BOOLEAN MODE) THEN 1 ELSE 0 END ) +
    ( CASE WHEN MATCH(table_1.field_def) AGAINST ("yellow" IN BOOLEAN MODE) THEN 1 ELSE 0 END ) +

    ( CASE WHEN MATCH(table_2.field_ghi) AGAINST ("spork" IN BOOLEAN MODE) THEN 1 ELSE 0 END ) +
    ( CASE WHEN MATCH(table_2.field_ghi) AGAINST ("yellow" IN BOOLEAN MODE) THEN 1 ELSE 0 END ) +

    ( CASE WHEN MATCH(table_2.field_ghi) AGAINST ("spork" IN BOOLEAN MODE) THEN 1 ELSE 0 END ) +
    ( CASE WHEN MATCH(table_2.field_ghi) AGAINST ("yellow" IN BOOLEAN MODE) THEN 1 ELSE 0 END )
)DESC;

我的真实数据库中有超过 1,000,000 条记录,我在 6.5027 秒内得到了结果。这比...好得多,好吧,花了这么长时间以至于它吐了!

我现在唯一的问题是......为什么它只适用于 IN BOOLEAN MODE 而不是 http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html#function_match 中提到的其他 2 个选项或 http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

关于mysql查询耗时过长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15960149/

相关文章:

MySQL 和查询性能

来自另一个表的 MySQL UPDATE 查询返回受影响的 0 行

mysql - 数据库结构

MySQL 管道排序似乎不起作用

php - 确定从 php 中调用函数的位置

php - 在 Codeigniter 上使用 HIghcharts 获取数据名称和总数

PHP mysql_real_escape_string 返回空字符串

mysql - 审计跟踪表的触发器

php - 为什么我无法获取文件路径并写入数据库?

mysql - 多个 WHERE MYSQL 语句中出现 'LIKE' 错误