Rumah >pangkalan data >tutorial mysql >Patutkah Lajur Kardinaliti Tinggi Diutamakan dalam Indeks Berbilang Lajur dengan Pertanyaan Julat?
Mengindeks dengan Lajur Cardinaliti Tinggi Terlebih Dahulu Apabila Melibatkan Julat
Pertimbangkan jadual berikut:
CREATE TABLE `files` ( `did` int(10) unsigned NOT NULL DEFAULT '0', `filename` varbinary(200) NOT NULL, `ext` varbinary(5) DEFAULT NULL, `fsize` double DEFAULT NULL, `filetime` datetime DEFAULT NULL, PRIMARY KEY (`did`,`filename`), KEY `fe` (`filetime`,`ext`), -- This? KEY `ef` (`ext`,`filetime`) -- or This? ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
Dengan juta baris dan kardinaliti tinggi untuk masa fail dan kardinaliti yang lebih rendah untuk ext, persoalannya timbul tentang indeks mana yang lebih berfaedah: fe atau ef.
Analisis dengan Force Index dan EXPLAIN
Menggunakan FORCE INDEX untuk menguji kedua-dua indeks mendedahkan perbezaan prestasi yang jelas :
-- Forcing the range on filetime first mysql> EXPLAIN SELECT COUNT(*), AVG(fsize) FROM files FORCE INDEX(fe) WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH;
-- Forcing the low-cardinality ext first mysql> EXPLAIN SELECT COUNT(*), AVG(fsize) FROM files FORCE INDEX(ef) WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH;
Output EXPLAIN menunjukkan bahawa ef adalah lebih pantas, menggunakan kurang baris untuk mendapatkan semula keputusan.
Analisis dengan Jejak Pengoptimum
Jejak Pengoptimum mengesahkan keunggulan ef:
"potential_range_indices": [ ... { "index": "fe", "usable": true, ... }, { "index": "ef", "usable": true, ... } ], "analyzing_range_alternatives": { "range_scan_alternatives": [ { "index": "fe", "ranges": [ "2015-01-01 00:00:00 <= filetime < 2015-02-01 00:00:00" ], "cost": 20022, -- Higher cost }, { "index": "ef", "ranges": [ "gif <= ext <= gif AND 2015-01-01 00:00:00 <= filetime < 2015-02-01 00:00:00" ], "cost": 646.61, -- Lower cost } ], }
Jejak mendedahkan bahawa ef boleh menggunakan kedua-dua lajur indeks, menghasilkan carian yang lebih cekap. Selain itu, ia menyerlahkan bahawa Pengoptimum hanya akan memeriksa lajur 'julat' pertama, menjadikan kardinaliti ext tidak relevan.
Kesimpulan
Berdasarkan analisis, ia adalah jelas bahawa apabila berurusan dengan pertanyaan julat yang melibatkan berbilang lajur diindeks, susunan lajur harus jadi:
Pendekatan ini memastikan bahawa indeks digunakan dengan paling berkesan, menghasilkan prestasi pertanyaan yang optimum.
Atas ialah kandungan terperinci Patutkah Lajur Kardinaliti Tinggi Diutamakan dalam Indeks Berbilang Lajur dengan Pertanyaan Julat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!