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

Saran diperlukan untuk mengindeks tabel dengan banyak bidang yang akan dicari dengan benar

Saya memiliki meja di tempat kerja dengan hal yang sama, banyak kolom dan 1000 cara berbeda untuk dipilih. Ini mimpi buruk. Namun saya menemukan, ada kombinasi filter tertentu yang sering digunakan. Ini adalah indeks yang akan saya buat dan tinggalkan yang lain yang jarang digunakan untuk berjalan lambat. Di MSSQL, saya dapat menjalankan kueri untuk menunjukkan kepada saya kueri paling mahal yang telah dijalankan terhadap database, mySQL harus memiliki hal yang serupa. Setelah saya memilikinya, saya membuat indeks yang menutupi kolom untuk mempercepatnya. Akhirnya, Anda akan memilikinya 90 persen tertutup. Saya pribadi tidak akan pernah mendesain meja seperti itu lagi kecuali saya memiliki AK47 yang menunjuk ke arah saya. (indeks saya 3 kali lebih besar dari data dalam tabel yang sangat tidak keren jika Anda perlu menambahkan banyak atau catatan). Saya tidak yakin bagaimana saya akan mendesain ulang tabel, pikiran pertama saya adalah membagi tabel menjadi dua , tapi itu akan menambah sakit kepala di tempat lain.

Tabel Pengguna (UserID, Nama)

1, Lisa
2, Jane
3, John

Tabel Atribut Pengguna(UserID, AttributeName,AttributeValue)

1, EYES, Brown
1, GENDER, Female
2, EYES, Blue
2, GENDER, Female
3  EYES, Blue
3, GENDER, Male

Ini akan membuat mengidentifikasi atribut lebih cepat, tetapi membuat kueri Anda tidak semudah menulis.

SELECT UserID, COUNT(*) as MatchingAttributes
FROM   UserAttributes 
WHERE  (UserAttributes.AttributeName = 'EYES' AND UserAttributes.AttributeValue = 'Blue') OR
       (UserAttributes.AttributeName = 'GENDER' AND UserAttributes.AttributeValue = 'Female') 

Ini akan mengembalikan yang berikut

UserID, MatchingAttributes
1, 1
2, 2
3, 1

Yang perlu Anda lakukan adalah menambahkan HAVING COUNT(*) =2 ke kueri untuk memilih hanya ID yang cocok. Ini sedikit lebih terlibat untuk dipilih, tetapi juga memberikan fitur yang rapi, Katakanlah Anda memfilter 10 Atribut, dan mengembalikan semua yang memiliki 10 kecocokan. Keren, tapi katakan tidak ada yang cocok 100%. Anda bisa mengatakan hei, saya tidak menemukan yang cocok, tetapi ini memiliki 9 dari 10 atau 90% cocok. (pastikan saja, jika saya mencari wanita pirang bermata biru, saya tidak mendapatkan pesan yang mengatakan bahwa tidak ada yang ditemukan tetapi di sini adalah yang paling cocok berikutnya yang berisi pria pirang bermata biru dengan skor pencocokan 60%. Itu akan menjadi sangat tidak keren)

Ada lebih banyak hal yang perlu dipertimbangkan jika Anda memilih untuk membagi tabel, seperti bagaimana Anda menyimpan atribut sebagai angka, tanggal, dan teks dalam satu kolom? Atau apakah ini tabel terpisah, atau kolom. Tidak ada jawaban yang mudah baik tabel lebar atau tabel terpisah.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyimpan Tag di Database. Simpan tag sekali atau berkali-kali?

  2. PILIH DI MANA DI (subquery) lambat

  3. Dalam SQL / MySQL, apa perbedaan antara ON dan WHERE dalam pernyataan bergabung?

  4. Menggunakan union dan order by klausa di mysql

  5. MySQL - bagaimana cara menyimpan waktu dengan zona waktu yang benar? (dari Jawa)