Maison >base de données >tutoriel mysql >Les tables InnoDB peuvent-elles exploiter la fonctionnalité de recherche en texte intégral sans outils externes ?
InnoDB peut-il utiliser la fonctionnalité de recherche en texte intégral ?
Une simple requête avec plusieurs opérateurs LIKE peut devenir inefficace lors de la recherche de plusieurs chaînes de recherche. Pour remédier à cela sur une table InnoDB sans utiliser d'outils externes comme Sphinx, pensez à adopter une table de texte intégral MyISAM pour ré-indexer dans vos tables InnoDB.
Schéma de base de données
Créez votre base de données en utilisant InnoDB comme moteur de stockage :
CREATE TABLE users (...) ENGINE=INNODB; CREATE TABLE forums (...) ENGINE=INNODB; CREATE TABLE threads ( forum_id SMALLINT UNSIGNED NOT NULL, thread_id INT UNSIGNED NOT NULL DEFAULT 0, user_id INT UNSIGNED NOT NULL, subject VARCHAR(255) NOT NULL, -- Desired search field created_date DATETIME NOT NULL, next_reply_id INT UNSIGNED NOT NULL DEFAULT 0, view_count INT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (forum_id, thread_id) -- Composite clustered PK index ) ENGINE=INNODB;
Ensuite, créez la table de recherche en texte intégral en utilisant MyISAM :
CREATE TABLE threads_ft ( forum_id SMALLINT UNSIGNED NOT NULL, thread_id INT UNSIGNED NOT NULL DEFAULT 0, subject VARCHAR(255) NOT NULL, FULLTEXT (subject), -- Fulltext index on subject PRIMARY KEY (forum_id, thread_id) -- Composite non-clustered index ) ENGINE=MYISAM;
Procédure stockée de recherche
Enfin, créez une procédure stockée pour votre recherche en texte intégral :
DROP PROCEDURE IF EXISTS ft_search_threads; DELIMITER # CREATE PROCEDURE ft_search_threads ( IN p_search VARCHAR(255) ) BEGIN SELECT t.*, f.title AS forum_title, u.username, MATCH(tft.subject) AGAINST (p_search IN BOOLEAN MODE) AS rank FROM threads_ft tft INNER JOIN threads t ON tft.forum_id = t.forum_id AND tft.thread_id = t.thread_id INNER JOIN forums f ON t.forum_id = f.forum_id INNER JOIN users u ON t.user_id = u.user_id WHERE MATCH(tft.subject) AGAINST (p_search IN BOOLEAN MODE) ORDER BY rank DESC LIMIT 100; END; CALL ft_search_threads('+innodb +clustered +index');
Avec ces modifications, vous pouvez implémenter efficacement des capacités de recherche de type texte intégral sur vos tables InnoDB sans recourir à des solutions externes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!