我之前只有一个表调用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`
(
上面的查询有效,我返回了宗教和种姓,但它比我的用户表中的简单硬编码值慢得多。
- 我的查询不好吗?
- 将所有值硬编码
users
表中是一个更好的主意吗?我试图节省尺寸。 - 如何提高查询的性能?
我在我的reactjs应用程序中使用它。 MYSQL是数据库。
以下是您可以在查询中实现的一些改进,以提高性能:
- 确保您的其他表
options_religion
,并且options_caste
具有超过rel_id
和cas_id
的索引(可能是 PRIMARY 索引(,以优化联接。 - 避免使用 LIKE,如果使用全名进行筛选,最好使用
=
来提高索引性能。否则,您需要在字段上建立索引以允许减去搜索性能。 - 如果要使用宗教名称(而不是 id(进行筛选,请使用新表
options_religion
而不是users
(请记住,用户中的宗教现在是一个整数(。此外,如果计划使用任何其他表进行筛选,则可以将联接更改为"内部联接"。 - 字段 users.gender 的值数量可能有限,如果您使用等于和全字值"男性"、"女性"等进行过滤,效率会更高。
- 通常,当您遇到一些性能问题时,您可以执行SQL查询的"解释"(使用文字值而不是变量(:
EXPLAIN SELECT users.id, users.username, users.gender, ...
。此说明的结果告诉您查询中涉及多少行。如果您在"行"中看到多个带有大数字的行,则可能需要一些额外的索引。
另外,为了确保不是前端问题(显示的行太多,带宽(,请尝试直接在数据库控制台或客户端中测试查询,并检查查询时间。
这是一个MySQL 性能问题。 检查联接字段上是否有索引。通常,您不应该直接在 reactApp 中查询 mysql,使用存储过程并包装在 REST 服务中或将其公开为 graphql 服务。
限制 500过于激进,如果确实有很多记录(如 500(要返回,请考虑对记录集进行分页。 尝试将限制设置为 10,看看应用是否运行得更快。