无论如何,这个查询花了 40 秒来加速它?数据库中的数据没有那么多

This Query took 40 seconds anyway to speed its up ? the data in the database arent that many

所以这个查询加载需要 40 秒,有什么办法可以加快它的速度吗?我使用的框架是 Laravel 我需要使用 ajax 来显示这些数据并且这个查询需要 40 秒来加载,我需要加快速度,我知道导致它的 r.10 - r.13 我对其进行了测试,发现 3 需要将近 20 秒才能加载

SELECT
    `ms_paket_berjalan`.`kdPaketBerjalan` as `r1`,
    `ms_pelanggan`.`namaLengkap` as `r2`,
    `ms_rtrwnet`.`kabupaten` as `r3`,
    `ms_paket_berjalan`.`jenis_pelanggan` as `r4`,
    `ms_rtrwnet`.`nama` as `r5`,
    DATE_FORMAT(ms_paket_berjalan.tglpasang, "%d/%m/%Y") as r6,
    `ms_paket_berjalan`.`noTelp` as `r7`,
    `ms_paket_berjalan`.`terverifikasi` as `r8`,
    `ms_paket_berjalan`.`hargaPaket` as `r9`,
    (
        SELECT
            COUNT(verifikasi_pelanggan.kdVerifikasi)
        FROM
            verifikasi_pelanggan
        WHERE
            verifikasi_pelanggan.kdPaketBerjalan = r1
    ) as r10,
    (
        SELECT
            verifikasi_pelanggan.statusVerifikasi
        FROM
            verifikasi_pelanggan
        WHERE
            verifikasi_pelanggan.kdPaketBerjalan = r1
        ORDER BY
            kdVerifikasi DESC
        LIMIT
            1
    ) as r11,
    (
        SELECT
            verifikasi_pelanggan.tanggalBa
        FROM
            verifikasi_pelanggan
        WHERE
            verifikasi_pelanggan.kdPaketBerjalan = r1
        ORDER BY
            kdVerifikasi DESC
        LIMIT
            1
    ) as r12,
    (
        SELECT
            COUNT(verifikasi_pelanggan.noBa)
        FROM
            verifikasi_pelanggan
        WHERE
            verifikasi_pelanggan.kdPaketBerjalan = r1
    ) as r13
FROM
    `ms_paket_berjalan`
    inner join `ms_pelanggan` on `ms_pelanggan`.`kdPelanggan` = `ms_paket_berjalan`.`kdPelanggan`
    inner join `ms_rtrwnet` on `ms_rtrwnet`.`kdRtRwNet` = `ms_pelanggan`.`kdRtRwNet`
    inner join `tr_resellerisp` on `tr_resellerisp`.`kdRtRwNet` = `ms_rtrwnet`.`kdRtRwNet`
    left join `verifikasi_pelanggan` on `ms_paket_berjalan`.`kdPaketBerjalan` = `verifikasi_pelanggan`.`kdPaketBerjalan`
WHERE
    `tr_resellerisp`.`kdIsp` = '11'
    and `ms_paket_berjalan`.`break` = '0'
    and `ms_paket_berjalan`.`deleted` = '0'
    and `ms_pelanggan`.`deleted` = '0'
    and `ms_pelanggan`.`suspended` = '0'
    and `tr_resellerisp`.`persetujuan` = '1'
    and `ms_paket_berjalan`.`terverifikasi` = '0'
    and (
        `ms_rtrwnet`.`nama` like '%%'
        or `ms_pelanggan`.`namaLengkap` like '%%'
    )
GROUP BY
    `ms_paket_berjalan`.`kdPaketBerjalan`
ORDER BY
    `ms_paket_berjalan`.`tglpasang` DESC
LIMIT
    20 offset 0

如果您的 verifikasi_pelanggan table 上没有索引,您需要。

要添加索引 运行 类似于:

ALTER TABLE `verifikasi_pelanggan` 
ADD INDEX `index4` (`kdPaketBerjalan` ASC, `kdVerifikasi` DESC)

只需执行一次,速度就会加快。

编辑:没有索引的查询将为每个结果扫描整个 verifikasi_pelanggan 多次。由于它有一个 ORDER BY 子句,它甚至不限于 20 个,它需要扫描每个结果然后排序,然后限制为 20 个结果。

INDEX 本质上是对 table 进行预排序。它几乎可以立即在索引列上找到匹配项,而不是扫描和读取每一行以查看它是否匹配。

仅在 kdPaketBerjalan 上建立索引应该会有很大帮助,但由于您按 kdVerifikasi 排序,因此看起来您可能在 kdPaketBerjalan 上有多个匹配项,这需要排序。在索引中包含 kdVerifikasi 将立即找到它。