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
Libérer: 2024-12-17 18:40:12
original
218 Les gens l'ont consulté

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;
Copier après la connexion

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;
Copier après la connexion

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');
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal