mysql查询在reactjs应用程序中具有多个连接,性能较慢

polhcujo  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(287)

打电话之前我只有一张table user 所有值都是硬编码的。以前查询速度更快。我的table以前是这样的:

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

宗教的选择

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

种姓的选择

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表中简单的硬编码值慢得多。
我的问题不好吗?
把所有的值都硬编码进去是不是更好 users table?我在试着节省尺寸。
如何提高查询的性能?
我在reactjs应用程序中使用这个。mysql是数据库。

lf5gs5x2

lf5gs5x21#

您可以在查询中实现以下改进以提高性能:
确保您的附加表 options_religion 以及 options_caste 有一个索引(可能是主索引)覆盖 rel_id 以及 cas_id 优化连接。
避免使用like如果您使用全名进行筛选,则最好使用 = 索引性能。否则,您需要在字段上建立索引以允许子字符串搜索性能。
如果要使用宗教名称(而不是id)进行筛选,请使用新表 options_religion 而不是 users (记住user中的宗教现在是一个整数)。此外,如果计划使用任何其他表进行筛选,可以将连接更改为内部连接。
字段users.gender可以有有限的值,如果使用等号和整词值“male”、“female”等进行筛选,效率会更高。
一般来说,当您遇到一些性能问题时,可以对sql查询执行“解释”(使用文本值而不是变量): EXPLAIN SELECT users.id, users.username, users.gender, ... . 这个解释的结果告诉您查询中涉及多少行。如果您在“rows”中看到多个带有大数字的行,可能需要一些额外的索引。
另外,为了确保不是前端问题(要显示的行太多、带宽太大),请尝试直接在数据库控制台或客户机中测试查询,并检查查询时间。

evrscar2

evrscar22#

这是mysql的性能问题。检查联接字段上是否有索引。通常情况下,您不应该直接在reactapp中查询mysql,而应该使用store过程并 Package 在rest服务中,或者将其公开为graphql服务。
限制500太激进了,如果您确实有很多记录(比如500条)要返回,请考虑对记录集进行分页。尝试将limit设置为10,看看你的应用程序是否运行得更快。

相关问题