这个查询花了40秒才加速?数据库中的数据没有那么多



所以这个查询需要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表上没有索引,则需要.

要添加索引,请运行以下操作:

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

只要做一次,事情就会加快。

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

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

仅仅在kdPaketBerjalan上进行索引应该会有很大帮助,但由于您是按kdVerifikasi排序的,所以在kdPaketBerjalan上可能有多个匹配项,这需要排序。将kdVerifikasi包含在索引中会立即找到它。

最新更新