mysql - 优化用于搜索文章的 sql 查询

标签 mysql sql query-optimization

我有一个用于搜索数据库的查询。查询在代码中构建并且术语被参数化,因此一切都运行良好且安全。我这么说是因为术语不能来自表格,因为它们是根据用户在搜索字段中输入的内容生成的。

一切正常,我只是想知道是否有更好/更快的方法来执行搜索。

SELECT
  sum(score * multiplier) score,
  a.id,
  a.title
FROM
(
  SELECT 3 score, 'a railway employee' term UNION ALL
  SELECT 2 score, 'railway employee' term UNION ALL
  SELECT 2 score, 'a railway' term UNION ALL
  SELECT 1 score, 'employee' term UNION ALL
  SELECT 1 score, 'railway' term UNION ALL
  SELECT 0 score, 'a' term
) terms
CROSS JOIN
(
  SELECT 'title' TYPE, 1 multiplier
  UNION ALL SELECT 'summary', 1.1
  UNION ALL SELECT 'detail', 1.5
) X
INNER JOIN
(
  SELECT id, 'title' TYPE, title SEARCH FROM article
  UNION ALL
  SELECT id, 'summary' TYPE, summary SEARCH FROM article WHERE summary <> ''
  UNION ALL
  SELECT artId, 'detail' TYPE, txt SEARCH FROM articleSections
) s ON s.TYPE = x.TYPE AND SEARCH LIKE concat('%', terms.term, '%')
INNER JOIN article a ON a.id = s.id
GROUP BY id, title
ORDER BY score DESC;
;

功能简单的演示在 sqlfiddle 上.

最佳答案

您的查询对我来说看起来不错。但是,如果您愿意通过为 UNION 的每个部分重复连接条件来以可读性换取性能,您可以获得更好的执行计划:

....
INNER JOIN
(
  SELECT id, 'title' TYPE, title SEARCH FROM article
   where title like '%a railway employee%' or 
  title like '%railway employee%' 
  or title like '%a railway%'
  or title like '%employee%'
  or title like '%railway%'
  or title like '%a%'
  UNION ALL ....

关于mysql - 优化用于搜索文章的 sql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17254393/

相关文章:

mysql - 如何获取MySQL中特定的列组合

MySQL单查询,父子关系跨表存储

sql - 不相关的表和时间间隔

sql - JOINS,EXISTS或IN中哪个更好?关于SQL的几个问题

mysql - 设置方程格式以仅显示 2dp

mysql - 如何从两个不相关的表中进行选择

mysql - 跨数据库使用 UNION |数据库

sql - 在 MySql 中强制执行查询以使用特定索引

sql - 帮助我进行 SQL 查询(需要它始终至少返回一行。)

mysql - Laravel,多对多表中具有属性的产品