Saya punya tabel MySQL yang sangat besar dengan sekitar 150.000 baris data. Saat ini, ketika saya mencoba dan menjalankan
SELECT * FROM table WHERE id = '1';
kode berfungsi dengan baik karena bidang ID adalah indeks utama. Namun, untuk pengembangan terbaru dalam proyek ini, saya harus mencari basis data dengan bidang lain. Sebagai contoh:
SELECT * FROM table WHERE product_id = '1';
Bidang ini sebelumnya tidak diindeks; Namun, saya telah menambahkan satu, jadi mysql sekarang mengindeks bidang, tetapi ketika saya mencoba menjalankan kueri di atas, ia berjalan sangat lambat. Kueri EXPLAIN mengungkapkan bahwa tidak ada indeks untuk bidang product_id ketika saya sudah menambahkannya, dan sebagai hasilnya kueri membutuhkan waktu mulai dari 20 menit hingga 30 menit untuk mengembalikan satu baris.
Hasil lengkap EXPLAIN saya adalah:
| id | select_type | table | type | possible_keys| key | key_len | ref | rows | Extra |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
| 1 | SIMPLE | table | ALL | NULL | NULL | NULL | NULL |157211 | Using where |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
Mungkin bermanfaat untuk dicatat bahwa saya baru saja melihatnya, dan bidang ID disimpan sebagai INT sedangkan bidang PRODUCT_ID disimpan sebagai VARCHAR. Mungkinkah ini sumber masalahnya?
sumber
EXPLAIN
hasil lengkap ? Apakah Anda yakin tidak ada indeks? Atau ada indeks di sana, tetapi MySQL memilih untuk tidak menggunakannya?Jawaban:
Jangan pernah dibandingkan
integer
denganstrings
di MySQL. Jikaid
adalahint
, menghapus tanda kutip.sumber
SHOW INDEXES FROM YOURTABLE
dev.mysql.com/doc/refman/5.0/id/show-index.html untuk memeriksa apakah indeks telah ditambahkansumber
ALTER TABLE tbl ADD INDEX (col)
bukanALTER TABLE tbl ADD INDEX col (col)
, kemudian menggunakanALTER TABLE tbl ADD INDEX (col)
lebih dari sekali akan terus menambahkan indeks bernamacol_2
,col_3
... setiap kali. Sedangkan menggunakanALTER TABLE tbl ADD INDEX col (col)
waktu ke - 2, akan memberiERROR 1061 (42000): Duplicate key name 'col'
.Anda dapat menggunakan sintaks ini untuk menambahkan indeks dan mengontrol jenis indeks (HASH atau BTREE).
Anda dapat mempelajari tentang perbedaan antara indeks BTREE dan HASH di sini: http://dev.mysql.com/doc/refman/5.5/id/index-btree-hash.html
sumber
Perlu dicatat bahwa beberapa indeks bidang dapat secara drastis meningkatkan kinerja kueri Anda. Jadi, dalam contoh di atas kita menganggap ProductID adalah satu-satunya bidang untuk pencarian tetapi permintaan untuk mengatakan ProductID = 1 DAN Kategori = 7 maka indeks beberapa kolom membantu. Ini dicapai dengan yang berikut:
Selain itu indeks harus cocok dengan urutan bidang kueri. Dalam contoh saya yang diperluas indeks harus (ProductID, Kategori) bukan sebaliknya.
sumber
the index should match the order of the query fields
?Indeks dari dua jenis dapat ditambahkan: ketika Anda mendefinisikan kunci utama, MySQL akan menjadikannya sebagai indeks secara default.
Penjelasan
Kunci utama sebagai indeks
Pertimbangkan Anda memiliki
tbl_student
tabel dan Anda inginstudent_id
sebagai kunci utama:Pernyataan di atas menambahkan kunci utama, yang berarti bahwa nilai yang diindeks harus unik dan tidak boleh NULL.
Tentukan nama indeks
Pernyataan di atas akan membuat indeks biasa dengan
student_index
nama.Buat indeks unik
Di sini,
student_unique_index
adalah nama indeks yang ditetapkan untuk student_id dan membuat indeks yang nilainya harus unik (di sini nol dapat diterima).Opsi teks lengkap
Pernyataan di atas akan membuat nama indeks Fulltext dengan
student_fulltext_index
, di mana Anda memerlukan MyISAM Mysql Engine.Bagaimana cara menghapus indeks?
Bagaimana cara memeriksa indeks yang tersedia?
sumber
Anda mengatakan Anda memiliki indeks, yang menjelaskan mengatakan sebaliknya. Namun, jika Anda benar-benar melakukannya, ini adalah cara untuk melanjutkan:
Jika Anda memiliki indeks pada kolom, dan MySQL memutuskan untuk tidak menggunakannya, itu mungkin karena:
ANALYZE TABLE
bantuan.Dalam kasus (2) atau (3), Anda dapat membujuk MySQL untuk menggunakan indeks menurut indeks petunjuk sytax , tetapi jika Anda melakukannya, pastikan menjalankan beberapa tes untuk menentukan apakah itu benar-benar meningkatkan kinerja untuk menggunakan indeks saat Anda mengisinya .
sumber