2010-02-11 4 views
3

Dans ma base de données de 5 millions de disques .. Structure de la table:MySQL Optimisation

CREATE TABLE IF NOT EXISTS `music` (
    `id` int(50) NOT NULL auto_increment, 
    `artistname` varchar(50) NOT NULL, 
    `songname` varchar(50) NOT NULL, 
    `duration` varchar(6) NOT NULL, 
    `url` varchar(255) NOT NULL, 
    `server` int(5) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `artistname` (`artistname`), 
    KEY `songname` (`songname`), 
    KEY `url` (`url`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; 

Comment puis-je optimiser la table et ensuite faire une recherche dans les champs « ARTISTNAME » et « songname »?

Désolé pour le mauvais anglais. De la Russie avec amour :-D

Répondre

6

Créer un index FULLTEXT:

CREATE FULLTEXT INDEX fx_music_artist_song ON music (artistname, songname) 

et émettre une requête comme celle-ci:

SELECT * 
FROM mytable 
WHERE MATCH(artistname, songname) AGAINST ('+queen +bohemian' IN BOOLEAN MODE) 

Cela correspond à la fois à travers artistname et songname, même si les mots ne mènent pas.

Pour correspondre seulement l'artiste, vous pouvez créer un index supplémentaire sur artistname seulement et l'utiliser dans une requête:

SELECT * 
FROM mytable 
WHERE MATCH(artistname) AGAINST ('+queen' IN BOOLEAN MODE) 

La colonne définie dans la clause MATCH doit être exactement la même que dans la définition d'index pour l'index correspondant à utiliser.

Notez que cette clause fonctionnera même sans l'index, mais dans ce cas, elle sera beaucoup plus lente.