2017-07-31 3 views
2

J'ai la conception de tableau suivant avec un indice de texte intégral et la requête suivante:MySQL - INDEX FULL TEXTE SUR COLONNES FOIRE MIS À JOUR

CREATE TABLE artists (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    title varchar(255) NOT NULL, 
    description text NOT NULL, 
    category_id INT NOT NULL, 
    -- some other columns excluded for brevity 
    FULLTEXT idx (title, description), 
    FOREIGN KEY fk_category(category_id) REFERENCES categories(id) 
) ENGINE=InnoDB; 


CREATE TABLE categories (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    name varchar(255) NOT NULL, 
    INDEX name_idx (name) 
) ENGINE=InnoDB; 



SELECT * 
    FROM artists 
INNER JOIN categories on categories.id = artists.category_id 
WHERE categories.name = 'Rock' AND MATCH (artists.name, artists.description) AGAINST ('Michael Jackson' IN BOOLEAN MODE); 

maintenant le titre et la description sont susceptibles d'être mis à jour fréquemment. Si j'ai des milliers d'enregistrements dans la table des artistes, cela signifie-t-il que l'index de texte intégral sera recréé chaque fois qu'un utilisateur éditera un titre ou une description ou insérera un nouvel enregistrement?

Quelle serait une meilleure conception pour s'adapter à un tel scénario? Dois-je déplacer les champs de titre et de description dans un tableau séparé et cela fera-t-il une différence?

Tout conseil serait apprécié. Note Je connais là d'autres méthodes pour implémenter la recherche plein texte telle que solr, élastique etc. mais je suis limité à ce qui est présentement.

+0

Utilisez-vous MyISAM ou InnoDB, et avez-vous lu la [documentation] (https://dev.mysql.com/doc/refman/5.7/fr/fulltext-fine-tuning.html)? –

+0

@Tim son innodb comme indiqué dans le code affiché. Les docs ne donnent aucun conseil à ce sujet. – adam78

+0

J'ai voté pour votre question. J'espère qu'un gourou de MySQL peut vous aider. –

Répondre

0

Non INDEX est "reconstruit à partir de zéro" chaque fois qu'un INSERT ou UPDATE se produit. Les index sont mis à jour "de manière incrémentielle". Et le moteur fait quelques optimisations pour minimiser le coût de ces mises à jour.

Par "fréquemment mis à jour", voulez-vous dire que vous modifiez fréquemment le titre de existant lignes? Ou voulez-vous dire que de nouvelles lignes sont ajoutées? Je pose cette question parce qu'il y a une différence dans les frais généraux entre les deux.