JeuWeb - Crée ton jeu par navigateur
Utilisation d'INDEX - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Utilisation d'INDEX (/showthread.php?tid=7785)

Pages : 1 2


Utilisation d'INDEX - MeTaLLiQuE - 18-03-2017

Bonjour,

Une chose que j'utilise rarement en SQL, c'est l'utilisation des INDEX.

J'ai voulu l'utiliser sur une table pour améliorer les performances des requêtes.

J'ai une table où j'ai inséré 3 millions de lignes qui sont répartis entre plusieurs joueurs de façon équilibrée.

Sans l'utilisation des INDEX, je suis à environs 1,5 secondes pour effectuer un rowCount()
Avec l'utilisation des INDEX, je suis également à 1,5 secondes...

Aurais-je louper quelque chose ?

L'INDEX se porte sur deux colonnes id_user et categorie.

Je vous mets l'index et un bout de la table SQL, si ça peut vous aider...

l'INDEX

CREATE INDEX `PK_user_categorie` ON `population` (`id_user`,`categorie`)
 

Table `population`


CREATE TABLE IF NOT EXISTS `population` (
 `id` int unsigned AUTO_INCREMENT,
 `id_user` int unsigned NOT NULL,
 `id_soldat` int unsigned NOT NULL,
 `categorie` varchar(20) NOT NULL,
 `localisation` int unsigned NOT NULL DEFAULT '0',

 PRIMARY KEY(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

Merci,


RE: Utilisation d'INDEX - julp - 18-03-2017

Pour quelle requête ?

Quel est le rapport avec rowCount ? (qui n'est pas officiellement prévu pour remplir le rôle de mysql_num_rows mais de mysql_affected_rows)

As-tu fait un EXPLAIN de ladite requête ?

Noter que si id_user est une FK, elle est déjà indexée (enfin, pour de l'InnoDB, pas du MyISAM ?)


RE: Utilisation d'INDEX - Dioux - 18-03-2017

je partirai plutôt sur l'engine innoDB vu ton nombre de clef étrangère et pour conserver l'intégrité de tes données


RE: Utilisation d'INDEX - MeTaLLiQuE - 18-03-2017

En faite... C'est bon...

Je ne sais pas ce que j'ai fait hier mais.... Revenu dans l'ordre...

J'ai tout supprimé et tout recodé... Et je passe largement sous la barre des 1s...

@Dioux Je regarderai... Toujours eu l'habitude d'utiliser MyISAM...

Merci de ta réponse Wink


RE: Utilisation d'INDEX - Xenos - 18-03-2017

InnoDB est à privilégier: les nouvelles features sont majoritairement dessus, et la gestion de clef étrangères et des transactions va vite devenir indispensable (sans compter qu'un MyISAM ne peut verrouiller que la table entière, et non une ligne seulement, donc quand le site commencera à se charger en utilisateurs, MyIsam risque de te coincer).

1s pour une requête, c'est méga-long. Le ROWCOUNT est caché par MySQL au niveau d'une table entière (ie: on peut récupérer le nombre total de lignes d'une table instantanément, quelque soit la taille de la table). Tu as une clause "WHERE" là dedans? Qui porte sur id_user? (et *éventuellement* sur categorie? qui d'ailleurs est un varchar: c'est nécessaire?)

Perso, sur varii.space, j'ai quelques millions d'objets célestes, agencés en arbre (un astéroïde tourne autour d'une Lune qui tourne autour d'une planète, qui tourne autour d'une étoile, qui tourne autour d'un dans un amas, qui tourne autour d'un trou noir qui tourne autour du centre de la galaxie; j'ai le tournis!). Le temps de réponse du MySQL est instantané (~100ms, que j'aille requêter le SQL ou non)


RE: Utilisation d'INDEX - MeTaLLiQuE - 18-03-2017

D'accord, je vais passer mes tables sous InnoDB alors

J'ai modifié l'INDEX donc du coup, je passe par trois colonnes id_soldat, id_user et categorie

Oui, j'ai une clause WHERE avec comme paramètres les trois colonnes citées juste au-dessus.

Pour la catégorie oui, c'est nécessaire ! Car dans la table, il y aura les soldats du joueur (qui peuvent être recruté sur une page dédiée) mais également d'autres types de population qui n'est pas recrutable ! (ils sont ajoutés journalèrement selon les bâtiments qui ont été construits) et qui n'ont rien avoir avec des soldats.


RE: Utilisation d'INDEX - Xenos - 18-03-2017

Donc cela ressemble à un ENUM, tout simplement. Cela sera plus robuste (compréhensible et intègre dans les données) et véloce dans le temps
Ton problème d'index était certainement un soucis d'ordre de colonnes. Cf mon article à ce sujet https://toile.reinom.com/mysql-clefs-multicolonnes/ (ou autre sur le net)


RE: Utilisation d'INDEX - MeTaLLiQuE - 18-03-2017

D'ordre dans les colonnes nan puisque lors des WHERE je commence toujours pas les colonnes à plus à gauche.

Je verrai pour mettre un ENUM() j'ai 5-6 données différentes pour la colonne.

Il était 1h du matin passé, je n'étais plus très frais à ce moment-là Wink

Tes articles je les ai déjà lus, j'aime bien ton site ^^

Merci pour tes réponses Smile


RE: Utilisation d'INDEX - niahoo - 18-03-2017

Juste un truc, c'est bizarre d'appeler ton index PK_user_categorie alors que ce n'est pas une PK.


RE: Utilisation d'INDEX - MeTaLLiQuE - 18-03-2017

(18-03-2017, 04:37 PM)niahoo a écrit : Juste un truc, c'est bizarre d'appeler ton index PK_user_categorie alors que ce n'est pas une PK.

Une erreur d'inatention quand j'ai écrit le sujet ^^