Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengapa mysql menekan indeks saat bungkus kolom dengan fungsi tanggal

Laporan EXPLAIN diketahui sulit untuk ditafsirkan. Mereka telah membebani terlalu banyak informasi ke dalam beberapa bidang. Anda dapat mencoba

type: index menunjukkan sedang melakukan index-scan , yang berarti mengunjungi setiap entri di index.

Ini mengunjungi jumlah entri yang sama dengan pemindaian tabel, kecuali terhadap indeks sekunder, bukan indeks berkerumun (utama).

Ketika kita melihat type: index , EXPLAIN menunjukkan possible_keys: NULL yang berarti tidak dapat menggunakan indeks apa pun untuk mencari secara efisien. Tapi itu juga menunjukkan key: add_time yang berarti indeks yang digunakan untuk pemindaian indeks adalah add_time .

Pemindaian indeks disebabkan oleh fakta bahwa MySQL tidak dapat mengoptimalkan ekspresi atau panggilan fungsi dengan sendirinya. Misalnya, jika Anda mencoba mencari tanggal dengan bulan tertentu, Anda dapat mencari month(add_time) = 4 tetapi itu tidak akan menggunakan indeks pada add_time karena tanggal dengan bulan itu tersebar di seluruh indeks, tidak semua dikelompokkan bersama.

Anda mungkin tahu bahwa date(add_time) harus dapat dicari oleh indeks, tetapi MySQL tidak membuat kesimpulan itu. MySQL hanya melihat bahwa Anda menggunakan suatu fungsi, dan bahkan tidak mencoba menggunakan indeks.

Itulah mengapa MySQL 5.7 memperkenalkan kolom yang dihasilkan untuk memungkinkan kami mengindeks ekspresi, dan MySQL 8.0 membuatnya lebih baik lagi dengan mengizinkan indeks yang ditentukan untuk ekspresi tanpa mengharuskan kita untuk mendefinisikan kolom yang dihasilkan terlebih dahulu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara membatasi penggunaan pada formulir atau membatasi akses

  2. Bagaimana cara menyimpan data yang tipenya bisa numerik, tanggal atau string di mysql

  3. Sisa di PostgreSQL, MS SQL Server, MySQL, dan SQLite

  4. Peringatan:mysqli_connect():(HY000/1045):Akses ditolak untuk pengguna 'root'@'localhost' (menggunakan kata sandi:TIDAK)

  5. Dapatkan Perbedaan Tanggal