具有多个连接的 MySQL 查询在 React js 应用程序中性能缓慢



我之前只有一个表调用user表,所有值都是硬编码的。查询过去更快。这是我以前的桌子:

id  username  religion     caste         gender
1   abc       Christian    catholic      Male
2   ahh       Hindu        caste 27      Female
3   hhh       Muslim       caste 73      Female    

现在我有单独的宗教和种姓表,如下所示,查询时间要长得多。我有以下表格:

用户

id  username  religion     caste         gender
1   abc       1            1             Male
2   ahh       2            27            Female
3   hhh       3            73            Female     

options_religion

rel_id       religion
1            Christian
2            Hindu
3            Muslim
4            Buddhist
.....

options_caste

cas_id      caste
1           catholic
2           orthodox
3           caste 3
4           caste 4
....

我有一个查询,可以选择用户并使用 LEFT JOIN 获取他们的宗教和种姓。

const findProfilesWithFilter = await db.query(
`SELECT users.id, users.username, users.gender,
options_religion.religion, options_caste.caste
FROM users
LEFT JOIN options_religion ON users.religion = options_religion.rel_id
LEFT JOIN options_caste ON users.caste = options_caste.cas_id
WHERE
users.${language} = ${db.escape(l)} AND
users.${religion} LIKE ${db.escape(r)} AND
users.${gender} LIKE  ${db.escape(g)}
ORDER BY users.id DESC LIMIT 500 OFFSET 0`

(

上面的查询有效,我返回了宗教和种姓,但它比我的用户表中的简单硬编码值慢得多。

  1. 我的查询不好吗?
  2. 将所有值硬编码users表中是一个更好的主意吗?我试图节省尺寸。
  3. 如何提高查询的性能?

我在我的reactjs应用程序中使用它。 MYSQL是数据库。

以下是您可以在查询中实现的一些改进,以提高性能:

  1. 确保您的其他表options_religion,并且options_caste具有超过rel_idcas_id的索引(可能是 PRIMARY 索引(,以优化联接。
  2. 避免使用 LIKE,如果使用全名进行筛选,最好使用=来提高索引性能。否则,您需要在字段上建立索引以允许减去搜索性能。
  3. 如果要使用宗教名称(而不是 id(进行筛选,请使用新表options_religion而不是users(请记住,用户中的宗教现在是一个整数(。此外,如果计划使用任何其他表进行筛选,则可以将联接更改为"内部联接"。
  4. 字段 users.gender 的值数量可能有限,如果您使用等于和全字值"男性"、"女性"等进行过滤,效率会更高。
  5. 通常,当您遇到一些性能问题时,您可以执行SQL查询的"解释"(使用文字值而不是变量(:EXPLAIN SELECT users.id, users.username, users.gender, ...。此说明的结果告诉您查询中涉及多少行。如果您在"行"中看到多个带有大数字的行,则可能需要一些额外的索引。

另外,为了确保不是前端问题(显示的行太多,带宽(,请尝试直接在数据库控制台或客户端中测试查询,并检查查询时间。

这是一个MySQL 性能问题。 检查联接字段上是否有索引。通常,您不应该直接在 reactApp 中查询 mysql,使用存储过程并包装在 REST 服务中或将其公开为 graphql 服务。

限制 500过于激进,如果确实有很多记录(如 500(要返回,请考虑对记录集进行分页。 尝试将限制设置为 10,看看应用是否运行得更快。

最新更新