打电话之前我只有一张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是数据库。
2条答案
按热度按时间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”中看到多个带有大数字的行,可能需要一些额外的索引。另外,为了确保不是前端问题(要显示的行太多、带宽太大),请尝试直接在数据库控制台或客户机中测试查询,并检查查询时间。
evrscar22#
这是mysql的性能问题。检查联接字段上是否有索引。通常情况下,您不应该直接在reactapp中查询mysql,而应该使用store过程并 Package 在rest服务中,或者将其公开为graphql服务。
限制500太激进了,如果您确实有很多记录(比如500条)要返回,请考虑对记录集进行分页。尝试将limit设置为10,看看你的应用程序是否运行得更快。