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

Cara terbaik untuk menyimpan tag untuk kecepatan di tabel yang sangat besar

Indeks FULLTEXT sebenarnya tidak secepat yang Anda kira.

Gunakan tabel terpisah untuk menyimpan tag Anda:

Table tags
----------
id integer PK
tag varchar(20)

Table tag_link
--------------
tag_id integer foreign key references tag(id)
content_id integer foreign key references content(id)
/* this table has a PK consisting of tag_id + content_id */

Table content
--------------
id integer PK
......

Anda PILIH semua konten dengan tag x dengan menggunakan:

SELECT c.* FROM tags t
INNER JOIN tag_link tl ON (t.id = tl.tag_id)
INNER JOIN content c ON (c.id = tl.content_id)
WHERE tag = 'test'
ORDER BY tl.content_id DESC /*latest content first*/
LIMIT 10;

Karena kunci asing, semua bidang dalam tag_links diindeks secara individual.
The `WHERE tags ='test' memilih 1 record (!).
Equi-gabungkan ini dengan 10.000 taglinks.
Dan Equi-bergabung itu dengan masing-masing 1 record konten (setiap tag_link hanya menunjuk ke 1 konten).
Karena batas 10, MySQL akan berhenti mencari segera setelah memiliki 10 item, jadi sebenarnya hanya melihat 10 record tag_links.
Content.id meningkat secara otomatis, jadi angka yang lebih tinggi merupakan proxy yang sangat cepat untuk artikel baru.

Dalam hal ini Anda tidak pernah perlu mencari apa pun selain kesetaraan dan Anda memulai dengan 1 tag yang Anda gabungkan dengan menggunakan kunci integer (penggabungan tercepat mungkin).

Tidak ada jika-maka-atau-tetapi tentang itu, ini adalah cara tercepat.

Perhatikan bahwa karena ada paling banyak 1000 tag, pencarian apa pun akan jauh lebih cepat daripada menggali tabel isi lengkap.

Akhirnya
Bidang CSV adalah ide yang sangat buruk, jangan pernah menggunakannya dalam database.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.sql.SQLException:Indeks Kolom di luar jangkauan, 0 <1

  2. MySQL INSERT - Apakah nama bidang memerlukan deliminasi backtick/aksen?

  3. Masalah dengan mysqldump:--defaults-extra-file option tidak berfungsi seperti yang diharapkan

  4. Kembalikan JSON dari MySQL dengan Nama Kolom

  5. Ping server MySQL