On m'a fait remarquer (très justement) que j'utilisais quelque fois des ordres SQL que tous le monde ne connaît pas forcément.
Donc paf, un tuto SQL

Les bases (pas de données

)
Les index : Savoir ou mettre les index.
La ou on en a besoin. Je sais c'est con de dire ça, mais c'est vraiment ce qu'il faut faire.
Très souvent je voie la table des User avec un index sur le nom.
Mais en fait vous faite une recherche 1 fois de temps en temps sur le nom, qu'elle intérêt qu'il soit indexé: aucun.
Même erreur, on fait une map et on index le type de case, on recherche jamais une case par son type, il vaut mieux indexer les coordonnées en X et en Y
Une chose à savoir, la recherche sur un Integer est des millier de fois plus rapide que la recherche sur une chaîne de caractère.
Donc le classique qui est : j'index toute mes tables sur le Login de mon utilisateur ce n'est vraiment pas génial. comme forcément vous vérifiez votre Utilisateur c'est facile de lui mettre un ID unique Integer et de faire l'indexation des tables sur cet ID.
Sans parler que toute vos query doivent utiliser login='$login' au lieu de log_id=$ID
Et si un jour vous voulez changer le login d'un utilisateur : bon courage.
Indexer une table de moins de 1000 enregistrements n'a que peut d'intérêt
En bref on index une table quand on à un problème de vitesse. Ou quand on est sur de soi.
Le selecton peut changer le nom d'une des variable d'un select
select x from map -> donne x=1, x=2 etc...
select x as lex from map -> donne lex=1, lex=2 etc ...
on peut faire un select sur une constante
Select 1 -> donne 1
donc
Select 1 as x -> donne x=1
On peut utiliser l'ordre UNION qui donne le résultat cumulé de deux requêtes
select x from map
union
select x from perso
-> x=1, x=2 etc...
Attention si la même valeur apparaît dans les deux select elle ne sera la qu'une seule fois
exemple
Select 1
union
select 1
-> 1 et pas 1,1
si on veut tout, on fait
select 1
union
allselect 1
-> 1, 1
réutilisation d'un select comme d'une table
on peut utiliser le résultat d'un select dans la clause from d'une requête
select x
from (select 1 as x) as matable
-> x=1
donc du coup je peut facilement faire un truc du style
select x,y
from (select 1 as x union select 2 union select 3 union select 4) as matablex,
(select 1 as y union select 2 union select 3 union select 4) as matabley
pour avoir tout les couples de 1,1 à 4,4
L'insertvous utilisez trop souvent le insert into map values(...)
Ce n'est pas génial car si vous modifier la table cela risque de donner des résultats étranges car les valeurs doivent être dans le bon ordre.
La bonne syntaxe c'est insert into map (x,y) values (...)
On indique les champs que l'on va insérer et l'ordre de présence.
L'avantage c'est que si map à un ID autoincrement, je n'ai pas besoin de lui donner une valeur.
et cela introduit à la méthode du Insert Select
A la place de la clause values on peut mettre une requête :
insert into map (x,y)
select lex, ley from ....
A quoi ça sert
petite explication sur comment fonctionne le moteur SQL
chaque fois qu'il reçois un ordre il fait
Analyse de la requête
Compilation de la requête
Execution de la requête
Validation de la requête
Libération de la mémoire
Chaque étape prend du temps donc quand on insert beaucoup d'enregistrements cela peut vraiment pauser un problème.
Si vous voulez insérer 3 lignes
insert into map (x,y) values (1,1) ;
insert into map (x,y) values (1,2) ;
insert into map (x,y) values (2,1) ;
cela va moins vite que
insert into map (x,y)
select 1,1
union
select 1,2
union
select 2,1
bon après on peut tout prendre en compte
Si je veux créer tous les couple de 1,1 à 4,4 c'est plus rapide (a écrire aussi) de faire
insert into map (x,y)
select x,y
from (select 1 as x union select 2 union select 3 union select 4) as matablex,
(select 1 as y union select 2 union select 3 union select 4) as matabley
que de me taper les 4*4 -> 16 lignes
en plus je peux faire fabriquer par PHP une partie de la requête pour ne pas avoir à la taper

La suite au prochain épisode
PS : si vous avez des questions j'essayerais d'y répondre
Amicalement, Pascal