无论如何,这个查询花了 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
将立即找到它。
所以这个查询加载需要 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
将立即找到它。