【问题标题】:Increase mysql query with sub-query performance使用子查询性能增加 mysql 查询
【发布时间】:2016-10-09 18:35:27
【问题描述】:

您好,我有这样的查询,如果我执行大约需要 15 秒,我该如何优化查询?

SELECT
    tr.id_igd,
    tr.rm,
    mpa.nama as nm_pasien,
    mpa.no_tlp_pasien as telp_pasien,
    mpa.rating,
    (SELECT d.nama FROM m_pegawai d WHERE d.nip = dokter) AS dokter,
    tr.status_pasien,
    tr.kunjungan,
    tr.tgl_checkup,
    tr.tgl_keluar
FROM
    t_igd tr 
INNER JOIN m_pasien mpa ON mpa.no_rm = tr.rm

【问题讨论】:

  • 查看解释计划,看看是否有可以使用索引的地方。添加索引。最值得注意的是那些no_rmrm 列可能会从索引中受益,因为它们用于连接,因此数据库需要它们来进行快速查找。但是由于您没有进行任何过滤(没有 where 子句),因此之后可能没有太多需要优化的地方。如果两个表都包含大量数据并且大部分 rm 值在它们之间共享,那么您可能不走运。
  • 请发布架构并解释。
  • 请为三张表分别提供SHOW CREATE TABLESHOW TABLE STATUS

标签: php mysql sql performance join


【解决方案1】:

我的意思是子查询可以改成另外一个JOIN:

SELECT
    tr.id_igd,
    tr.rm,
    mpa.nama as nm_pasien,
    mpa.no_tlp_pasien as telp_pasien,
    mpa.rating,
    d.nama AS dokter,
    tr.status_pasien,
    tr.kunjungan,
    tr.tgl_checkup,
    tr.tgl_keluar
FROM
    t_igd tr 
INNER JOIN m_pasien mpa ON mpa.no_rm = tr.rm
LEFT JOIN m_pegawai d ON d.nip = dokter;

【讨论】:

  • 不知道join是否会改变返回的记录数。相关子查询不会改变它,但连接可能会。
  • 如果连接的表不是一对一的表,那么源查询不起作用,所以我的意思是表 m_pegawai 对于每个 t_igd 记录没有超过 1 行,所以返回的数量记录不变
猜你喜欢
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2011-10-23
  • 1970-01-01
相关资源
最近更新 更多