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

Pengindeksan yang benar saat menggunakan operator OR

Anda salah memahami cara kerja indeks.

Pikirkan buku telepon (setara dengan indeks dua kolom pada nama belakang depan, nama depan belakang). Jika saya meminta Anda untuk menemukan semua orang dalam buku telepon yang nama belakangnya adalah "Smith", Anda dapat mengambil manfaat dari fakta bahwa nama-nama tersebut diurutkan seperti itu; Anda dapat berasumsi bahwa Smiths diatur bersama. Tetapi jika saya meminta Anda untuk menemukan semua orang yang nama depannya adalah "John", Anda tidak mendapatkan manfaat dari indeks. Johns dapat memiliki nama belakang apa saja, sehingga mereka tersebar di seluruh buku dan Anda akhirnya harus mencari dengan susah payah, dari depan ke belakang.

Sekarang jika saya meminta Anda untuk menemukan semua orang yang nama belakangnya adalah "Smith" ATAU yang nama depannya adalah "John", Anda dapat menemukan keluarga Smith dengan mudah seperti sebelumnya, tetapi itu tidak membantu Anda sama sekali untuk menemukan keluarga John. Mereka masih tersebar di seluruh buku dan Anda harus mencarinya dengan susah payah.

Itu sama dengan indeks multi-kolom di SQL. Indeks diurutkan berdasarkan kolom pertama, kemudian diurutkan berdasarkan kolom kedua jika seri di kolom pertama, kemudian diurutkan berdasarkan kolom ketiga jika ada seri di dua kolom pertama, dll. Tidak diurutkan berdasarkan semua kolom serentak. Jadi indeks multi-kolom Anda tidak membantu membuat istilah penelusuran Anda lebih efisien, kecuali untuk kolom paling kiri dalam indeks.

Kembali ke pertanyaan awal Anda.

Buat indeks kolom tunggal yang terpisah pada setiap kolom. Salah satu indeks ini akan menjadi pilihan yang lebih baik daripada yang lain, berdasarkan perkiraan berapa banyak operasi I/O indeks akan dikenakan jika digunakan.

Versi modern MySQL juga memiliki beberapa kecerdasan tentang penggabungan indeks , jadi kueri mungkin gunakan lebih dari satu indeks dalam tabel tertentu, lalu coba gabungkan hasilnya. Jika tidak, MySQL cenderung terbatas untuk menggunakan satu indeks per tabel dalam kueri tertentu.

Trik lain yang berhasil digunakan banyak orang adalah melakukan kueri terpisah untuk setiap kolom yang diindeks (yang seharusnya menggunakan indeks masing-masing) dan kemudian UNION hasilnya.

SELECT fields FROM table WHERE field1='something' 
UNION
SELECT fields FROM table WHERE field2='something' 
UNION
SELECT fields FROM table WHERE field3='something' 
UNION
SELECT fields FROM table WHERE field4='something' 

Satu pengamatan terakhir:jika Anda menemukan diri Anda mencari 'something' yang sama di empat bidang, Anda harus mempertimbangkan kembali jika keempat bidang sebenarnya adalah hal yang sama, dan Anda bersalah merancang tabel yang melanggar bentuk Normal Pertama dengan grup berulang . Jika demikian, mungkin field1 hingga field4 termasuk dalam satu kolom di tabel anak. Maka menjadi jauh lebih mudah untuk mengindeks dan membuat kueri:

SELECT fields from table INNER JOIN child_table ON table.pk = child_table.fk
WHERE child_table.field = 'something'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan Grup Non-Menangkap di MySQL REGEXP

  2. SQL fixed-value IN() vs. INNER JOIN performance

  3. Bagaimana cara menambahkan baris baru ke jTable dari database sambil mengklik tombol tanpa menghapus baris yang ada

  4. mysql:Apa sintaks yang tepat untuk NOT LIKE?

  5. mysql_fetch_array() mengembalikan 'argumen yang diberikan bukan sumber hasil MySQL yang valid'