【问题标题】:Limiting the number of rows joined in SQL while using inner join,limit and order by在使用内连接时限制在 SQL 中连接的行数,limit 和 order by
【发布时间】:2019-05-23 13:31:24
【问题描述】:

我有很多表需要在获取要显示的数据之前进行连接。

我也在使用内部连接,我只想显示前 20 个结果。

所以问题是目前查询正在扫描整个表,因为它会先排序,然后提取前 20 行,并且我无法将要排序的列作为主索引,尽管它已被索引。

第二件事是查询也使用了联接,所以有没有办法从父表中获取前 20 个结果(排序列存在于父表本身中),然后减少被连接的行,从而减少连接时间? 查询是这样的:

select distinct patientFirstName as patientFirstName, patientLastName 
as patientLastName from EncounterInformationBean inner join LastName 
ON
EncounterInformationBean.id=LastName.uid
where
patientFirstName like key and isActive=1 order by patientFirstName
LIMIT 20

key是一个字符串类型的变量名。

感谢任何针对该问题的优化策略。

我已经为要排序的列建立了索引(虽然不是作为主键),但主要问题是加入。

一种方法可以是非规范化,但要显示很多列。

【问题讨论】:

  • 没有看到查询和对数据的理解,任何人都无法帮助您。
  • @GordonLinoff 添加了查询。
  • 请用它所在的表来限定每一列。并提供SHOW CREATE TABLE。并告诉我们like key 打算做什么。并提供EXPLAIN SELECT ...
  • 我假设EncounterInformationBean 表比LastName 表有更多的数据。 isActive 列来自哪里?索引是否至少包含您的WHERE 条件中的任何列?
  • 另一个问题,你想在哪个表上加上LIMIT?因为您提到 “有没有办法让我从父表中获得前 20 个结果” 。如果是这样,您可以子查询父表以首先返回前 20 行,然后将其与另一个表连接。我认为它会更快。

标签: mysql sql optimization inner-join limit


【解决方案1】:
  • 不要使用DISTINCT
  • 正确拼写ORDER BY
  • 到底是什么like key
  • INDEX(isActive, patientFirstName)

【讨论】:

  • 是的,我很糟糕,它是按顺序排序的……而且键是一个字符串……有什么办法可以避免加入整个表格吗?
  • @abhihacker02 - 在不知道哪个列在哪个表中 (SHOW CREATE TABLE) 的情况下,我无法完成帮助您优化查询。
猜你喜欢
  • 2023-03-16
  • 2014-03-17
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
相关资源
最近更新 更多