Fonctionnalités cachées de MySQL

15

Dans la longue tradition des fonctionnalités cachées, ayons une liste des fonctionnalités cachées dans MySQL.

Mettez une fonctionnalité par réponse.

Voir aussi:
Fonctionnalités cachées de Linux
Fonctionnalités cachées de PowerShell
Fonctionnalités cachées d'Oracle Database
Fonctionnalités cachées de Windows 2008
Fonctionnalités cachées de Solaris / OpenSolaris
Fonctionnalités cachées de SQL Server
Fonctionnalités cachées d'IIS (6.0 / 7.0)

Binoj Antony
la source

Réponses:

9

Un souvent inutilisé mais plus verbeux

AFFICHER LA LISTE DE PROCESSUS COMPLÈTE

est pratique, mais pas aussi bon que le génial analyseur de requêtes non-entreprise - activer comme ça

    mysql> set profiling = 1;
    Requête OK, 0 lignes affectées (0,00 sec)

Ces deux sont des requêtes inutiles pour remplir le tableau des profils,

        
    mysql> sélectionnez * dans _test.customers;
    ERREUR 1146 (42S02): la table '_test.customers' n'existe pas

    mysql> sélectionnez * dans test.customers limit 0;
    Ensemble vide (0,00 sec)
    

Obtenez une liste de toutes les requêtes profilées et leur durée

        
    mysql> afficher les profils;
    + ---------- + ------------ + ------------------------- ------ +
    | Query_ID | Durée | Requête |
    + ---------- + ------------ + ------------------------- ------ +
    | 1 | 0,00013400 | sélectionnez * parmi _test.customers |
    | 2 | 0,01546500 | sélectionnez * dans test.customers |
    + ---------- + ------------ + ------------------------- ------ +

Les informations d'affichage pour la dernière requête seraient simplement "afficher le profil" - ou vous pouvez spécifier une requête

  
    mysql> afficher le profil de la requête 2;
    + ---------------------- + ---------- +
    | Statut | Durée |
    + ---------------------- + ---------- +
    | début | 0,000053 |
    | vérification des autorisations | 0,000007 |
    | Tables d'ouverture | 0,000014 |
    | Verrouillage du système | 0,000006 |
    | Serrure de table | 0,000008 |
    | init | 0,000065 |
    | optimisation | 0,000003 |
    | exécution | 0,000201 |
    | fin | 0,000003 |
    | fin de la requête | 0,000002 |
    | articles gratuits | 0,000020 |
    | enregistrement d'une requête lente | 0,000002 |
    | nettoyage | 0,000004 |
    + ---------------------- + ---------- +
    13 lignes en jeu (0,00 sec)

Vous pouvez également demander des informations spécifiques telles que CPU, BLOCK IO et SWAPS entre autres (le tout sur la page de manuel )

  
    mysql> afficher le cpu du profil pour la requête 2;
    + ---------------------- + ---------- + ---------- + ---- -------- +
    | Statut | Durée | CPU_user | CPU_system |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    | début | 0,000056 | 0,001000 | 0,000000 |
    | vérification des autorisations | 0,000007 | 0,000000 | 0,000000 |
    | Tables d'ouverture | 0,000010 | 0,000000 | 0,000000 |
    | Verrouillage du système | 0,000005 | 0,000000 | 0,000000 |
    | Serrure de table | 0,000007 | 0,000000 | 0,000000 |
    | init | 0,000059 | 0,000000 | 0,000000 |
    | optimisation | 0,000003 | 0,000000 | 0,000000 |
    | statistiques | 0,015022 | 0,000000 | 0,000000 |
    | préparation | 0,000014 | 0,001000 | 0,000000 |
    | exécution | 0,000004 | 0,000000 | 0,000000 |
    | Envoi de données | 0,000245 | 0,000000 | 0,000000 |
    | fin | 0,000004 | 0,000000 | 0,000000 |
    | fin de la requête | 0,000002 | 0,000000 | 0,000000 |
    | articles gratuits | 0,000021 | 0,000000 | 0,000000 |
    | enregistrement d'une requête lente | 0,000002 | 0,000000 | 0,000000 |
    | nettoyage | 0,000004 | 0,000000 | 0,000000 |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    16 lignes en jeu (0,00 sec)

N'oubliez pas de le désactiver par la suite, car la journalisation ajoute des frais généraux.

  
    mysql> set profiling = 0;
    Requête OK, 0 lignes affectées (0,00 sec)
Andy
la source
vous pouvez également utiliser SHOW PROFILE ALL FOR QUERY X pour afficher toutes les données de profilage.
Kedare
8

Certaines commandes MySQL qui ne sont pas toujours connues ou mémorisées.

Changez l'orientation du jeu de résultats en vertical pour faciliter la lecture et le collage.

mysql> SELECT CURDATE(), CURTIME()\G
*************************** 1. row ***************************
CURDATE(): 2009-06-26
CURTIME(): 12:10:37

Annulez la requête que vous tapez actuellement tout en la laissant dans votre historique.

mysql> SELECT CURDATE(), CURTIME()\c
mysql>

Modifiez une requête ou la dernière requête (respectivement) avec votre $ EDITOR préféré.

mysql> SELECT CURDATE(), CURTIME()\e
mysql> \e

Effacez la sortie de la console.

mysql> \! clear

Comparez les jeux de résultats par hachage MD5.

mysql> pager md5sum -
PAGER set to 'md5sum -'
mysql> SELECT CURDATE(), CURTIME();
d24e22e4e2d33dfda9f01ba934b7676a  -
mysql> nopager
PAGER set to stdout

Modifiez votre invite.

mysql> prompt (\u@\h) [\d]>\_
PROMPT set to '(\u@\h) [\d]>\_'
(dan@localhost) [test]>

Recherchez dans l'historique de vos commandes une chaîne donnée (comme Bash).
Commencez à taper un terme de recherche et répétez ^ R pour parcourir les résultats.

^R
(reverse-i-search)`DATE': SELECT CURDATE(), CURTIME();
Dan Carley
la source
+1 sur md5sum. J'aime l' md5sum -idée d'utiliser comme téléavertisseur. Tu
n'es
4

Trucs que j'ai appris qui peuvent être utiles à certains:

Pour exécuter le fichier que vous avez précédemment enregistré:

source filename      # Alternatively you can enter "\\. filename".

Utilisation "\!" pour accéder aux commandes shell. Par exemple:

\\! ls c*sql   # To list all your SQL files in directory starting with "c".

Donc, si vous souhaitez écrire votre déclaration dans un fichier (sans utiliser l'option éditeur), vous pouvez entrer:

\\! echo 'select * from emp where job ="salesman" '   > test2.sql   # Editor option seems easier to me though!

Si vous entrez

\\T filename

vous aurez alors vos relevés et résultats de requête dirigés / imprimés vers le nom de fichier que vous avez spécifié. Utilisez \\tpour désactiver cette fonction.

Terminer une requête avec \\Gau lieu d'un ";" afin d'afficher la sortie dans un format de ligne plutôt que dans des colonnes.

N'excluez pas l'utilisation d'une clause Where ... LIKE avec l'instruction SHOW. Par exemple:

SHOW STATUS LIKE '%cache%';

Enfin, pour trouver l'emplacement de votre répertoire de données MySQL sans regarder le my.cnffichier, utilisez:

SHOW VARIABLES LIKE 'datadir';
DBMarcos99
la source
3

J'aime personnellement la SHOWcommande

Vous pourriez faire
SHOW PROCESSLIST- Pour voir toutes les connexions en cours d'exécution à mysql
SHOW CREATE TABLE TableName- Pour voir le sql utilisé pour créer la table
SHOW CREATE PROCEDURE ProcedureName- Pour voir le sql utilisé pour créer le SP
SHOW VARIABLES- Pour voir toutes les variables système

Obtenez la liste complète ici

Binoj Antony
la source
1
Je suis un peu perplexe en vous listant des commandes bien connues et documentées telles que SHOW et EXPLAIN comme "fonctionnalités cachées". Une fonctionnalité cachée n'est-elle pas documentée?
John Gardeniers
Eh bien, l'intention est de faire ressortir les commandes utiles pas si bien connues, ce qui peut être bien connu de quelqu'un peut être inconnu de quelqu'un d'autre, que dire?
Binoj Antony
3

En fait documenté , mais très ennuyeux: conversions de date automatiques pour les données incorrectes.

Avant MySQL 5.0.2, MySQL pardonne les valeurs de données illégales ou incorrectes et les contraint à des valeurs légales pour la saisie de données. Dans MySQL 5.0.2 et versions ultérieures, cela reste le comportement par défaut, mais vous pouvez changer le mode SQL du serveur pour sélectionner un traitement plus traditionnel des mauvaises valeurs de sorte que le serveur les rejette et abandonne l'instruction dans laquelle elles se produisent.

Parfois, vous serez "chanceux" lorsque MySQL n'ajuste pas l'entrée aux dates valides à proximité, mais la stocke à la place comme 0000-00-00par définition non valide. Cependant, même dans ce cas, vous auriez pu souhaiter que MySQL échoue plutôt que de stocker cette valeur en silence pour vous.

Arjan
la source
3

Une autre caractéristique qui distingue MySQL des autres bases de données est la REPLACE INTOcommande. Tu peux faire:

REPLACE INTO T1 (Col1, Col2 )
SELECT Col1, Col2 FROM T2;

Vous pouvez également écrire l'instruction replace comme vous écrivez l'instruction update:

REPLACE INTO T1 
SET Col1 = 'SomeValue1'
, Col2   = 'SomeValue2'
Binoj Antony
la source
1
REPLACE INTO est utile, mais il convient de noter qu'il effectue une vérification des clés, SUPPRIME si une clé correspondante est trouvée, puis enfin INSERT, ce qui prend beaucoup plus de temps que INSERT ... ON DUPLICATE KEY UPDATE
Andy
2

Pas vraiment une fonctionnalité cachée, mais elle est moins connue et je l'utilise beaucoup pour économiser en faisant une requête pour vérifier si quelque chose existe avant de faire une MISE À JOUR ou INSÉRER

INSERT ... ON DUPLICATE KEY UPDATE

La documentation est ici

Paul Dixon
la source
1

Pour voir le plan d'exécution des requêtes, utilisez EXPLAIN

par exemple

EXPLAIN 
SELECT T1.Col1, T2.Col2
FROM T1 INNER JOIN T2 ON T1.Id = T2.Id
WHERE T1.Col3 = 10
Binoj Antony
la source
1

Pas vraiment caché, mais le journal des requêtes lentes peut être très utile pour rechercher la cause des problèmes de performances aux heures de pointe.

Dans le fichier my.cnf, section [mysqld] - ajoutez:

log_slow_queries=/var/log/mysql/mysql-slow.log
# log queries that took more than 1 sec
long_query_time = 1
pQd
la source
0

Tout comme un ajout à la réponse de pQD (en tant que noobie, je ne suis pas encore en mesure d'ajouter un commentaire), si vous n'avez pas encore ajouté le chemin vers le journal des requêtes lentes dans le fichier my.cnf correct, le journal des erreurs sera écrit dans le répertoire de données (utilisez SHOW VARIABLES LIKE 'datadir'; pour savoir où il se trouve) et le nom de fichier sera au format [nom système] -slow.log

DBMarcos99
la source