首页 > 解决方案 > 具有多个连接的 MySQL 查询在 React js App 中性能缓慢

问题描述

在调用表之前我只有一张表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 是数据库。

标签: mysqlreactjs

解决方案


这些是您可以在查询中实施以提高性能的一些改进:

  1. 确保您的附加表 options_religionoptions_caste一个索引(可能是 PRIMARY 索引)rel_idcas_id优化连接。
  2. 如果您使用全名进行过滤,请避免使用 LIKE,这将更好地=用于索引性能。否则,您需要在该字段上建立一个索引以实现子串搜索性能。
  3. 如果您想使用宗教名称(而不是 id)进行过滤,请使用新表options_religion而不是users(请记住 user 中的宗教现在是整数)。此外,如果您计划使用任何其他表进行过滤,您可以将连接更改为 INNER JOIN。
  4. 字段 users.gender 可能有数量有限的值,如果您使用 equals 和整个单词值“男性”、“女性”等进行过滤,效率会更高。
  5. 通常,当您遇到一些性能问题时,您可以执行 SQL 查询的“EXPLAIN”(使用文字值而不是变量) EXPLAIN SELECT users.id, users.username, users.gender, ...:此解释的结果告诉您查询中涉及多少行。如果您在“行”中看到多行具有大数字,则可能需要一些额外的索引。

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


推荐阅读