Características ocultas de MySQL

15

En la larga tradición de tener características ocultas, tengamos una lista de características ocultas en MySQL.

Pon una característica por respuesta.

Consulte también:
Características ocultas de Linux
Características ocultas de PowerShell
Características ocultas de Oracle Database
Características ocultas de Windows 2008
Características ocultas de Solaris / OpenSolaris
Características ocultas de SQL Server
Características ocultas de IIS (6.0 / 7.0)

Binoj Antony
fuente

Respuestas:

9

A menudo no utilizado pero más detallado

MOSTRAR LISTA DE PROCESOS COMPLETA

es útil, pero no tan bueno como el increíble analizador de consultas no empresarial : habilítelo

    mysql> establecer perfiles = 1;
    Consulta OK, 0 filas afectadas (0.00 seg)

Estas dos son consultas basura para llenar la tabla de perfiles,

        
    mysql> select * from _test.customers;
    ERROR 1146 (42S02): la tabla '_test.customers' no existe

    mysql> select * from test.customers limit 0;
    Conjunto vacío (0.00 seg)
    

Obtenga una lista de todas las consultas perfiladas y su duración

        
    mysql> mostrar perfiles;
    + ---------- + ------------ + ------------------------- ------ +
    El | Query_ID | Duración | Consulta |
    + ---------- + ------------ + ------------------------- ------ +
    El | 1 | 0.00013400 | seleccione * de _test.customers |
    El | 2 | 0,01546500 | seleccione * de test.customers |
    + ---------- + ------------ + ------------------------- ------ +

Mostrar información para la última consulta sería simplemente "mostrar perfil", o puede especificar una consulta

  
    mysql> muestra el perfil para la consulta 2;
    + ---------------------- + ---------- +
    El | Estado | Duración |
    + ---------------------- + ---------- +
    El | comenzando | 0,000053 |
    El | comprobación de permisos | 0,000007 |
    El | Mesas de apertura | 0,000014 |
    El | Bloqueo del sistema | 0,000006 |
    El | Bloqueo de mesa | 0,000008 |
    El | init | 0,000065 |
    El | optimizando | 0,000003 |
    El | ejecutando | 0,000201 |
    El | fin | 0,000003 |
    El | consulta final | 0,000002 |
    El | artículos de liberación | 0,000020 |
    El | consulta lenta de registro | 0,000002 |
    El | limpieza | 0,000004 |
    + ---------------------- + ---------- +
    13 filas en conjunto (0.00 seg)

También puede solicitar información específica como CPU, BLOCK IO y SWAPS entre otros ( todo en la página de manual )

  
    mysql> muestra la CPU del perfil para la consulta 2;
    + ---------------------- + ---------- + ---------- + ---- -------- +
    El | Estado | Duración | CPU_user | CPU_system |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    El | comenzando | 0,000056 | 0,001000 | 0,000000 |
    El | comprobación de permisos | 0,000007 | 0,000000 | 0,000000 |
    El | Mesas de apertura | 0,000010 | 0,000000 | 0,000000 |
    El | Bloqueo del sistema | 0,000005 | 0,000000 | 0,000000 |
    El | Bloqueo de mesa | 0,000007 | 0,000000 | 0,000000 |
    El | init | 0,000059 | 0,000000 | 0,000000 |
    El | optimizando | 0,000003 | 0,000000 | 0,000000 |
    El | estadísticas | 0,015022 | 0,000000 | 0,000000 |
    El | preparando | 0,000014 | 0,001000 | 0,000000 |
    El | ejecutando | 0,000004 | 0,000000 | 0,000000 |
    El | Enviando datos | 0,000245 | 0,000000 | 0,000000 |
    El | fin | 0,000004 | 0,000000 | 0,000000 |
    El | consulta final | 0,000002 | 0,000000 | 0,000000 |
    El | artículos de liberación | 0,000021 | 0,000000 | 0,000000 |
    El | consulta lenta de registro | 0,000002 | 0,000000 | 0,000000 |
    El | limpieza | 0,000004 | 0,000000 | 0,000000 |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    16 filas en conjunto (0.00 seg)

No olvide deshabilitarlo después, ya que el registro agrega sobrecarga.

  
    mysql> establecer perfiles = 0;
    Consulta OK, 0 filas afectadas (0.00 seg)
Andy
fuente
también puede usar SHOW PROFILE ALL FOR QUERY X para mostrar todos los datos de creación de perfiles.
Kedare
8

Algunos comandos MySQL que no siempre son conocidos o recordados comúnmente.

Cambie la orientación del conjunto de resultados a vertical para facilitar la lectura y el pegado.

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

Cancele la consulta que está escribiendo actualmente mientras la deja en su historial.

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

Edite una consulta o la última consulta (respectivamente) con su $ EDITOR favorito.

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

Borre la salida de la consola.

mysql> \! clear

Comparar conjuntos de resultados por hash MD5.

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

Cambia tu solicitud.

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

Busque en su historial de comandos una cadena determinada (como Bash).
Comience a escribir un término de búsqueda y repita ^ R para recorrer los resultados.

^R
(reverse-i-search)`DATE': SELECT CURDATE(), CURTIME();
Dan Carley
fuente
+1 en md5sum. Me gusta la md5sum -idea de usar como buscapersonas. No es realmente específico de MySQL
serverhorror
4

Trucos que he aprendido que pueden ser útiles para algunos:

Para ejecutar el archivo que guardó anteriormente:

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

Utilizar "\!" para acceder a los comandos de shell. Por ejemplo:

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

Entonces, si desea escribir su declaración en un archivo (sin usar la opción de editor), puede ingresar:

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

Si entras

\\T filename

entonces tendrá sus declaraciones y resultados de consultas dirigidos / impresos al nombre de archivo que especificó. Use \\tpara apagar esto.

Termine una consulta con en \\Glugar de un ";" para mostrar la salida en un formato de fila en lugar de en columnas.

No descarte usar una cláusula Where ... LIKE con la instrucción SHOW. Por ejemplo:

SHOW STATUS LIKE '%cache%';

Por último, para encontrar la ubicación de su directorio de datos MySQL sin mirar el my.cnfuso del archivo:

SHOW VARIABLES LIKE 'datadir';
DBMarcos99
fuente
3

Personalmente me gusta el SHOWcomando

Podría hacer
SHOW PROCESSLIST: para ver todas las conexiones en ejecución a mysql
SHOW CREATE TABLE TableName: para ver el sql utilizado para crear la tabla
SHOW CREATE PROCEDURE ProcedureName: para ver el sql utilizado para crear el SP
SHOW VARIABLES: para ver todas las variables del sistema

Obtenga la lista completa aquí

Binoj Antony
fuente
1
Me desconcierta un poco que enumeres comandos bien conocidos y documentados como SHOW y EXPLAIN como "características ocultas". ¿No es una característica oculta una que no está documentada?
John Gardeniers
Bueno, la intención es sacar los comandos útiles no tan conocidos, lo que puede ser conocido para alguien puede ser desconocido para otra persona, ¿qué decir?
Binoj Antony
3

Realmente documentado , pero muy molesto: conversiones de fechas automáticas para datos incorrectos.

Antes de MySQL 5.0.2, MySQL perdona los valores de datos ilegales o incorrectos y los obliga a valores legales para la entrada de datos. En MySQL 5.0.2 y versiones posteriores, ese sigue siendo el comportamiento predeterminado, pero puede cambiar el modo SQL del servidor para seleccionar un tratamiento más tradicional de los valores incorrectos, de modo que el servidor los rechace y anule la declaración en la que se producen.

A veces tendrá "suerte" cuando MySQL no ajuste la entrada a fechas válidas cercanas, sino que la almacene como 0000-00-00que, por definición, no es válida. Sin embargo, incluso entonces podría haber querido que MySQL fallara en lugar de almacenar silenciosamente este valor por usted.

Arjan
fuente
3

Otra característica que diferencia a MySQL de otras bases de datos es el REPLACE INTOcomando. Tu puedes hacer:

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

También puede escribir la declaración de reemplazo al igual que escribe la declaración de actualización:

REPLACE INTO T1 
SET Col1 = 'SomeValue1'
, Col2   = 'SomeValue2'
Binoj Antony
fuente
1
REPLACE INTO es útil, pero debe tenerse en cuenta que realiza una verificación de clave, DELETE si se encuentra una clave coincidente, finalmente INSERT, lo que lleva mucho más tiempo que INSERT ... EN LA ACTUALIZACIÓN DE CLAVE DUPLICADA
Andy
2

Realmente no es una característica oculta, pero es menos conocida y la uso mucho para guardar haciendo una consulta para verificar si existe algo antes de hacer una ACTUALIZACIÓN o INSERTAR

INSERT ... ON DUPLICATE KEY UPDATE

La documentación está aquí

Paul Dixon
fuente
1

Para ver el plan de ejecución de consultas use EXPLAIN

p.ej

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

No está realmente oculto, pero el registro de consulta lenta puede ser realmente útil para rastrear la causa de los problemas de rendimiento en las horas punta.

En el archivo my.cnf, sección [mysqld] - agregue:

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

Solo como una adición a la respuesta de pQD (como novato todavía no puedo agregar un comentario), si aún no ha agregado la ruta al registro de consulta lenta en el archivo my.cnf correcto, el registro de error será escrito en el directorio de datos (use SHOW VARIABLES LIKE 'datadir'; para averiguar dónde está) y el nombre del archivo estará en el formato [nombre del sistema] -slow.log

DBMarcos99
fuente