Rumah > Artikel > pangkalan data > Mysql's in tidak menggunakan index
MySQL ialah sistem pengurusan pangkalan data hubungan yang berkuasa yang menggunakan indeks untuk mempercepatkan pengambilan data, dengan itu meningkatkan prestasi pangkalan data. Walau bagaimanapun, dalam beberapa kes, pernyataan pertanyaan MySQL mungkin tidak menggunakan indeks, yang akan menyebabkan penurunan prestasi yang serius.
Artikel ini akan meneroka sebab mengapa pernyataan dalam pertanyaan dalam MySQL tidak melalui indeks, dan memperkenalkan cara untuk meningkatkan prestasi dengan mengoptimumkan pernyataan pertanyaan dan mewujudkan indeks yang sesuai.
Dalam MySQL, pernyataan in query digunakan untuk menentukan sama ada nilai sasaran wujud dalam senarai nilai yang ditentukan. Contohnya:
SELECT * FROM table WHERE id IN (1, 2, 3);
Pernyataan pertanyaan ini akan mengembalikan semua baris dengan id 1, 2 atau 3 dalam jadual.
Semasa pelaksanaan pertanyaan, MySQL akan melaksanakan pertanyaan yang sepadan untuk setiap nilai dalam senarai, dan kemudian menggabungkan hasilnya bersama-sama. Jika senarai mengandungi sejumlah besar nilai, proses ini boleh memakan masa yang sangat lama, menjejaskan prestasi pertanyaan.
Untuk meningkatkan kecekapan pertanyaan, MySQL biasanya menggunakan indeks untuk mempercepatkan pertanyaan. Indeks ialah struktur data khas yang membantu MySQL mencari baris data yang diperlukan dengan cepat. Apabila MySQL melaksanakan pertanyaan dalam, jika indeks meliputi semua lajur pertanyaan, MySQL boleh menggunakan indeks ini untuk mempercepatkan pertanyaan. Ini boleh mengurangkan kos pertanyaan.
Namun, apabila MySQL menggunakan pernyataan dalam pertanyaan, ia tidak selalu dapat menggunakan indeks sedia ada . Sebab mengapa MySQL tidak menggunakan indeks biasanya termasuk yang berikut:
2.1 Senarai nilai terlalu panjang
MySQL akan membandingkan setiap nilai dalam senarai dengan indeks apabila melaksanakan pertanyaan dalam untuk menentukan Sama ada nilai ini berada dalam indeks. Oleh itu, jika senarai nilai terlalu panjang, MySQL tidak akan menggunakan indeks dan sebaliknya akan menggunakan imbasan jadual penuh untuk melaksanakan pertanyaan. Ini boleh menyebabkan penurunan drastik dalam prestasi pertanyaan, terutamanya apabila jumlah data dalam jadual adalah sangat besar.
2.2 Senarai nilai tidak sepadan dengan jenis data indeks
Sebab lain ialah MySQL tidak boleh menggunakan indeks apabila jenis data dalam senarai nilai tidak sepadan dengan jenis data medan indeks. Sebagai contoh, jika medan diindeks adalah jenis int tetapi senarai nilai mengandungi nilai rentetan jenis atau tarikh, MySQL tidak akan dapat menggunakan indeks untuk melaksanakan pertanyaan.
2.3 Terdapat nilai NULL dalam senarai nilai
Jika senarai nilai mengandungi nilai NULL, MySQL tidak akan dapat menggunakan indeks untuk melaksanakan pertanyaan. Sebabnya ialah indeks tidak boleh mengandungi nilai NULL, jadi MySQL perlu melakukan imbasan jadual penuh untuk mencari baris yang mengandungi nilai NULL.
2.4 Senarai nilai tidak berada pada kedudukan awalan indeks
MySQL hanya sepadan dengan nilai dalam senarai nilai pada kedudukan awalan indeks. Jika nilai senarai nilai tidak berada dalam kedudukan awalan indeks, MySQL tidak akan dapat menggunakan indeks untuk mempercepatkan pertanyaan.
Untuk mengelakkan situasi di mana dalam pertanyaan tidak menggunakan indeks, beberapa langkah pengoptimuman perlu diambil untuk meningkatkan prestasi pertanyaan . Berikut ialah beberapa cadangan pengoptimuman:
3.1 Hadkan panjang senarai nilai
Jika anda perlu menggunakan pernyataan dalam pertanyaan, anda boleh mengehadkan panjang senarai nilai untuk memastikan MySQL boleh menggunakan indeks untuk melaksanakan pertanyaan. Khususnya, anda boleh cuba memecahkan senarai nilai kepada beberapa senarai nilai yang lebih kecil dan kemudian menggunakan operasi UNION ALL untuk menggabungkan hasilnya bersama-sama. Ini membolehkan MySQL menggunakan indeks untuk setiap senarai kecil nilai.
3.2 Gunakan EXISTS dan bukannya IN
EXISTS ialah alternatif kepada pertanyaan IN, yang boleh meningkatkan prestasi pertanyaan dengan sangat baik. Khususnya, pertanyaan dalam boleh ditukar kepada pertanyaan wujud, seperti:
SELECT * FROM table WHERE EXISTS (SELECT 1 FROM table2 WHERE table.id = table2.id);
Pertanyaan ini menyemak sama ada terdapat baris yang sepadan antara kedua-dua jadual. Jika MySQL boleh menggunakan indeks untuk mendapatkan semula baris ini, masa untuk melaksanakan pertanyaan akan dikurangkan dengan ketara.
3.3 Pastikan jenis data senarai nilai sepadan dengan jenis data medan indeks
Satu lagi cadangan pengoptimuman adalah untuk memastikan jenis data senarai nilai sepadan dengan jenis data bagi medan indeks. Jika terdapat ketidakpadanan, anda boleh menggunakan fungsi penukaran jenis untuk memaksa padanan, seperti fungsi CAST atau CONVERT.
3.4 Elakkan memasukkan nilai NULL dalam senarai nilai
Untuk mengelakkan MySQL tidak dapat menggunakan indeks, jangan masukkan nilai NULL dalam senarai nilai. Jika anda perlu menanyakan baris yang mengandungi nilai NULL, gunakan operator IS NULL atau IS NOT NULL.
3.5 Pastikan nilai dalam senarai nilai berada pada kedudukan awalan indeks
Akhir sekali, anda boleh cuba mengalihkan nilai dalam senarai nilai ke kedudukan awalan daripada indeks untuk memastikan MySQL boleh menggunakan indeks untuk melaksanakan pertanyaan. Anda boleh menggunakan klausa ORDER BY dan klausa LIMIT untuk mengawal susunan dan panjang set hasil supaya MySQL boleh menggunakan indeks untuk melaksanakan pertanyaan.
Disebabkan cara pernyataan dalam pertanyaan berfungsi dan cara ia digunakan, MySQL tidak sentiasa boleh menggunakan indeks untuk mempercepatkan dalam pertanyaan. Untuk mengelakkan masalah ini, anda boleh menggunakan cadangan pengoptimuman di atas untuk meningkatkan prestasi pertanyaan.
Secara amnya, mengoptimumkan prestasi pernyataan pertanyaan MySQL memerlukan pemahaman mekanisme dalaman dan teknik pengoptimuman MySQL. Dengan mengoptimumkan indeks dan pernyataan pertanyaan, prestasi dan kebolehskalaan MySQL boleh dipertingkatkan dengan ketara, membolehkannya memproses data besar-besaran dengan lebih berkesan.
Atas ialah kandungan terperinci Mysql's in tidak menggunakan index. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!