2017-06-23 1 views
0

Ma base de données de MySQL a la structure suivante:PHP MYSQL- Utiliser l'indexation? Est-ce possible dans ce cas?

enter image description here

Quand je lance une requête simple contre elle, il faut jusqu'à 30 secondes pour exécuter. La requête est -

SELECT signinid,photo,first_name,last_name,persontosee,signindate,signintime,isstaff,signouttime,signoutdate,issignedin,companyname,veh_reg 
FROM signin_entries 
WHERE issignedin ='YES' 
AND isstaff='YES' 

Quand je lance EXPLIQUER contre ce que je peux voir est en train de traiter toutes les 1180 lignes, le problème est colonnes, photo, signature et code qr toutes contiennent des chaînes codées en base64. (Bien que dans mon instruction select, je ne fais qu'interroger 'photo')

Comment puis-je créer un index pour cela? Un indice est-il même correct? Pourquoi faut-il jusqu'à 30 secondes pour exécuter la requête simple?

Merci pour votre temps

Explain statement

+0

Pouvez-vous ajouter la sortie EXPLIQUER? – Neodan

+0

id select_type type de table touches_propriété clé clé_len ref rangées supplémentaires 1 SIMPLE signin_entries ALL staffsignedin NULL NULL NULL 1218 Utilisation où – Retroisbest

Répondre

0

issignedin est une colonne de texte. vous ne pouvez pas indexer les colonnes de texte. changez-le en varchar et ajoutez un index.

+0

Varchar pour une colonne d'état? – GhostGambler

+0

Je ne suppose pas que l'auteur limite les valeurs à "oui" ou "non". si tel était le cas, je recommanderais plutôt un smallint ou un enum –

+0

en supposant que ce soit le cas, alors je recommanderais de changer issignedin et isstaff en smallints, et d'ajouter une clé qui couvre les deux ("alter table signin_entries add key signedin_staff (issignedin, isstaff); ") –

4

Il y a plusieurs problèmes avec votre structure actuelle:

  • Vous devez utiliser le type le plus petit possible pour les colonnes, par exemple enum pour les colonnes avec certaines valeurs possibles fixes ("oui", "non", "peut-être") ou un boolean encore plus simple pour les colonnes "oui"/"non".
  • Vous ne devez pas stocker l'heure dans les colonnes varchar, mais time ou timestamp.
  • Peut-être que vous devriez convertir les colonnes date existantes en datetime comme vous voudrez peut-être stocker l'heure aussi.
  • Vous ne devez pas stocker de données binaires dans la base de données, sauf si vous avez une bonne raison à cela.

après avoir corrigé toutes les questions que vous pouvez ajouter un index combiné sur les deux colonnes pour améliorer le temps d'exécution plus:

CREATE INDEX issignedinandstaff ON signin_entries (issignedin, isstaff) 
+0

trop vite pour moi! Enum devrait être évité cependant, il est assez inefficace et ne détient aucune valeur réelle par rapport à un varchar/boolean/int sauf peut-être l'espace pris sur le disque sur des ensembles de données extrêmement volumineux. Si OP ne veut pas l'heure, peut-être aussi suggérer d'utiliser le type de données 'DATE'.+1 de toute façon – FMashiro

+0

@FMashiro Pourquoi pensez-vous que «enum» est inefficace? C'est fondamentalement un 'smallint', vous pouvez même utiliser les valeurs numériques. 'Varchar' est inefficace, car il s'agit en effet d'une chaîne et ne doit pas être utilisé pour des plages de valeurs fixes. – GhostGambler

+0

Merci GhostGambler, Malheureusement im coincé en utilisant des données binaires (base64) en maintenant la sauvegarde et l'emplacement des fichiers est un problème, si je prends la colonne 'photo' de la requête l'exécution de cette requête est rapide ... même avec EXPLAIN montrant ma requête utilise un index, cela prend encore beaucoup de temps. – Retroisbest