Saya mempunyai pertanyaan dalam pangkalan data saya yang mengambil masa 25 saat untuk mengembalikan hasil, yang terlalu panjang. Nampaknya ia sepatutnya agak mudah. Dua jadual; jadual utama (dokumen) ialah jadual standard dengan beberapa lajur data, dan jadual sambungan ialah jadual pemetaan dengan hanya dua lajur (id_ibu bapa, id_bahagian). Sebelum ini tiada indeks pada jadual pemetaan, jadi saya menambah indeks dan menukar "tafsiran" untuk memasukkan indeks, tetapi ia nampaknya tidak memberi kesan kepada prestasi.
Pertanyaan kelihatan seperti ini:
explain SELECT DISTINCT doc.* FROM document doc LEFT JOIN multi_division_mapper divisions ON doc.id = divisions.parent_id WHERE doc.clientId = 'SOME_GUID' AND (divisions.division_id IS NULL OR divisions.division_id IN ('SOME_GUID'));
Hasil penjelasan ialah:
Jumlah bilangan baris dalam dokumen: 6720 Jumlah bilangan baris dalam pemeta: 6173
Berdasarkan maklumat yang saya kumpul, saya perlu menambah baik "jenis" atau "tambahan" untuk membuat pertanyaan lebih cepat. Apa yang boleh saya buat di sini?
Buat pernyataan jadual:
CREATE TABLE `document` ( `id` varchar(36) NOT NULL, `addedBy` varchar(255) DEFAULT NULL, `addedDate` datetime NOT NULL, `editedBy` varchar(255) DEFAULT NULL, `editedDate` datetime NOT NULL, `deleted` bit(1) DEFAULT NULL, `clientId` varchar(36) NOT NULL, `departmentId` varchar(36) DEFAULT NULL, `documentParentId` varchar(36) DEFAULT NULL, `documentParent` varchar(50) DEFAULT NULL, `fileId` varchar(255) DEFAULT NULL, `fileUrl` varchar(600) DEFAULT NULL, `documentName` varchar(500) NOT NULL, `displayName` varchar(255) NOT NULL, `documentId` varchar(45) DEFAULT NULL, `notes` varchar(1000) DEFAULT NULL, `visibility` varchar(45) NOT NULL DEFAULT 'PRIVATE', `documentType` varchar(45) NOT NULL, `restrictDelete` bit(1) NOT NULL, `customData` text, `releaseDate` datetime NOT NULL, `expirationDate` datetime NOT NULL, `isApproved` bit(1) NOT NULL DEFAULT b'0', `userSupplier` varchar(36) DEFAULT NULL, `complianceCertificateId` varchar(36) DEFAULT NULL, `Status` varchar(50) DEFAULT 'NEUTRAL', PRIMARY KEY (`id`), KEY `idx_client` (`clientId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `multi_division_mapper` ( `parent_id` varchar(36) NOT NULL, `division_id` varchar(36) NOT NULL, PRIMARY KEY (`parent_id`,`division_id`), KEY `idx_parent` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Saya dapat mendapatkan laporan EXPLAIN yang lebih baik dalam ujian saya dengan mencipta indeks berikut:
Saya juga mengalih keluar
idx_parent
kerana ia berlebihan; ia adalah awalan untuk kunci utama.