Maison >base de données >tutoriel mysql >Les tables InnoDB peuvent-elles exploiter la fonctionnalité de recherche en texte intégral sans outils externes ?

Les tables InnoDB peuvent-elles exploiter la fonctionnalité de recherche en texte intégral sans outils externes ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-17 18:40:12159parcourir

Can InnoDB Tables Leverage Full-Text Search Functionality Without External Tools?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn