2010-09-11 4 views
1

J'ai dans ma base de données MySQL:ces deux tables optimisation de la structure des requêtes MySQL/base de données

CREATE TABLE IF NOT EXISTS `articles` (
    `id` bigint(20) NOT NULL, 
    `url` varchar(255) collate utf8_bin NOT NULL, 
    `img` varchar(255) collate utf8_bin NOT NULL, 
    `name` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, 
    `url_key` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, 
    `type_code` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, 
    `likes_count` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `type` (`type`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

CREATE TABLE IF NOT EXISTS `articles_types` (
    `id` int(11) NOT NULL auto_increment, 
    `code` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, 
    `url_key` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, 
    `name` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name` (`code`), 
    KEY `type` (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 

Et je suis en train d'exécuter cette requête:

SELECT a.* FROM `articles` a INNER JOIN articles_types at ON at.`code`=a.type ORDER BY p.likes_count DESC LIMIT 1 

qui retourne 1 rang, en 1sec.

Les articles de table se composent d'environ 70k rangées, les articles_types seulement environ 70 rangées.

Y a-t-il une chance d'optimiser la structure (peut-être le moteur?) De ces tables, ou d'optimiser la requête elle-même pour la rendre plus rapide?

+0

Avez-vous des indices sur ces tableaux? Si oui, dites-nous quelles colonnes sont couvertes. –

+0

2Dustin: Comme vous pouvez le voir ci-dessus, les tables se composent de plusieurs index, maintenant j'ai ajouté un nouvel index à articles.like_count, parce que les résultats sont triés par cette colonne. Mais cela n'a pas aidé. –

+0

2Damien: Merci d'avoir réfléchi à ce sujet :-) Croyez-moi, si j'obtenais vraiment réponse, ce qui résoudrait mes problèmes, j'accepterais cette réponse. –

Répondre

4

Vous devriez examiner la sortie de EXPLAIN sur votre requête

Il est probable que l'ordre par vous obtient, afin de créer un index sur articles.likes_count

+0

Vous avez absolument raison. Le problème ici est l'ORDERing - mais même après avoir ajouté l'index à articles.likes_count, cela prend 1-2sec.Sans trier les résultats (sans ORDER BY) c'est très rapide - par exemple. 0,0004sec. –

+0

Il a aidé à utiliser LEFT JOIN au lieu de INNER JOIN. Peut-être que cela peut arriver, cela apparaîtra un article avec une catégorie inconnue, donc je vais devoir vérifier cela dans l'application. –