Archivo de la categoría Bases de datos
Comodidad para el cliente de comandos de MySQL
Si conectamos a menudo con nuestro servidor de MySQL utilizando la utilidad del comando “mysql”, nos veremos compelidos a repetir, una y otra vez, los parámetros de conexión
mysql -u usuario -p contraseña
Podemos ahorrarnos un buen montón de tecleos si creamos un archivo ~/.my.cnf en nuestra carpeta de usuario, con el siguiente contenido:
user = usuario_mysql
password = contraseña_mysql
host = host_mysql
El cliente de mysql encontrará y utilizará de forma automática la información contenida en este fichero, ahorrándonos el tecleo constante o tener que hacernos un .sh para un proceso tan simple.
Si preferimos no indicar la contraseña en texto plano en este fichero, por seguridad, podemos dejar el contenido asi:
user = usuario_mysql
password
host = host_mysql
Y el cliente de mysql nos pedirá sólo la contraseña al conectar.
Localizar las tablas MySQL más grandes de nuestro servidor
Sólo apto para MySQL 5:
-
SELECT
-
CONCAT(table_schema,'.',table_name),
-
CONCAT(ROUND(table_rows/1000000,2),'M') rows,
-
CONCAT(ROUND(data_length/(1024*1024*1024),2),'G') DATA,
-
CONCAT(ROUND(index_length/(1024*1024*1024),2),'G') idx,
-
CONCAT(ROUND((data_length+index_length)/(1024*1024*1024),2),'G') total_size,
-
ROUND(index_length/data_length,2) idxfrac FROM information_schema.TABLES
-
ORDER BY data_length+index_length DESC LIMIT 10;
Lo que hace, vulgarmente, viene siendo recopilar información de la tabla TABLES de la BD INFORMATION_SCHEMA, una nueva BD por defecto en las distribuciones 5 y posteriores, que almacena información acerca de todas las tablas de todas las bds del servidor. Muy práctico para saber cual es ese cliente de nuestro servidor que se está comiendo el disco duro a golpe de almacenar basura :)
El ejemplo de resultado se explica sólo:
-
+-------------------------------------+--------+--------+--------+------------+---------+
-
| CONCAT(table_schema,'.',table_name) | rows | DATA | idx | total_size | idxfrac |
-
+-------------------------------------+--------+--------+--------+------------+---------+
-
| art87.link_out87 | 37.25M | 14.83G | 14.17G | 29.00G | 0.96 |
-
| art87.article87 | 12.67M | 15.83G | 4.79G | 20.62G | 0.30 |
-
| art116.article116 | 10.49M | 12.52G | 3.65G | 16.18G | 0.29 |
-
| art84.article84 | 10.10M | 10.11G | 3.59G | 13.70G | 0.35 |
-
| art104.link_out104 | 23.66M | 6.63G | 6.55G | 13.18G | 0.99 |
-
| art118.article118 | 7.06M | 10.49G | 2.68G | 13.17G | 0.26 |
-
| art106.article106 | 9.86M | 10.19G | 2.76G | 12.95G | 0.27 |
-
| art85.article85 | 6.20M | 9.82G | 2.51G | 12.33G | 0.26 |
-
| art91.article91 | 8.66M | 9.17G | 2.66G | 11.83G | 0.29 |
-
| art94.article94 | 5.21M | 10.10G | 1.69G | 11.79G | 0.17 |
-
+-------------------------------------+--------+--------+--------+------------+---------+
-
10 rows IN SET (2 min 29.19 sec)
El creador original de la función es Peter Zaitsev, de MySQL Performance Blog, antiguo Responsable de Rendimiento en MySQL Inc.
Test rápidos de MySQL - Test 2

Test 2
La tabla pruebas está definida en un servidor MySQL con modos sql no fijados:
-
CREATE TABLE pruebas (
-
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT
-
);
Ahora hacemos…
-
INSERT INTO pruebas (id) VALUES (NULL);
-
SELECT * FROM pruebas WHERE id IS NULL
La pregunta es... ¿ Cual será el resultado del SELECT ?
Pulsa para Mostrar/Ocultar la solución
Traducido con permiso expreso de Mysql Test Quiz 2 Original
Creado por Carsten H. Pedersen
Otros Test anteriores:
Nuevo motor de almacenamiento para MySQL, Maria
En el blog de Michael Widenius podemos seguir el progreso de "Maria", el que será el sucesor del motor de almacenamiento para bases de datos más utilizado del mundo, MyISAM de MySQL. Monty, el creador de MySQL, dió el nombre a su empresa basándose en el nombre de su primera hija 'My' + SQL. Su segundo hijo, Max, dió su nombre a MaxDB y las distribuciones MySQL-Max. Su tercera hija se llama, obviamente, Maria...
Esta nueva opción viene a sumarse a Falcon, el motor en desarrollo que parece destinado a sustituir a InnoDB.
Las primeras previews están ya disponibles en:
http://dev.mysql.com/downloads/maria/index.html
Documentación y más información:
http://forge.mysql.com/wiki/Maria_Preview
Roadmap y Diseño:
http://forge.mysql.com/wiki/Maria_RoadMap_Design
Test rápidos de MySQL - Test 1

He decidido incluir los MySQL Test Quizzes de Carsten H. Pedersen entre estas notas, como recordatorio y como fuente de inspiración para procesos de selección de personal a la hora de contratar gente que vaya a trabajar principalmente con MySQL. Simplemente traduciré los Test del inglés y publicaré la solución como comentario.
Test 1
- Dada la siguiente estructura MySQL
CREATE TABLE prueba (
id INT NOT NULL,
data CHAR(30) DEFAULT NULL,
UNIQUE (id, data)
);- Y una vez ejecutado este INSERT
INSERT INTO prueba VALUES (1, NULL);
...que hace que se inserte un registro en la BD, y recordando que el ínidce UNIQUE afecta a ambas columnas, que pasa si repetimos el mismo comando INSERT de nuevo ?
¿ Cuantos registros se guardan en dicha tabla tras el segundo INSERT ? ¿ Con qué valores ?
Pulsa para Mostrar/Ocultar la solución
Traducido con permiso expreso de Mysql Test Quiz 1 Original
Paginando resultados en la consola de MySQL
Muchas veces, utilizando la consola de MySQL, nos encontramos con el problema de que el conjunto de resultados que obtenemos en las pruebas es muy superior al alto de pantalla, asi que nos tiramos todo el dia "p'arriba" con la barra de scroll, "p'abajo" con la barra de scroll.
La solución más sencilla que conozco es ejecutar esto antes de ponernos a realizar consultas:
-
mysql> \P less
-
PAGER SET to ‘less’
Pulsando cualquier tecla avanzaremos página a página, cuando lleguemos al final, simplemente el buffer se detendrá, y para salir basta con pulsar "q".
Cómodo, muy cómodo.
Miscelánea de enlaces sobre Bases de datos
- Optimizaciones de subqueries en MySQL 6, en MySQL 6.0 Subquery optimizations are published
- Ojo con el tipo de índices que defines en las tablas Memory, en algunas circunstancias un índice BTREE puede ser hasta un 20000% más rápido, ahi es nada. Más información y test en Performance gotcha of MySQL memory tables
- Sun Microsystems Announces Completion of MySQL Acquisition; Paves Way for Secure, Open Source Platform to Power the Network Economy, Sun Microsystems (Nota de prensa)
- Adobe throws weight behind SQLite, The Register, Kelly Fiveash
- MySQL Multi Master-Master on EC2, interesante opción.
- PostgreSQL vs. MySQL: Who has the best community?, análisis en CNET
- Materialized Magic - Incrementally refreshing Materialized Views w/ MySQL 5 , merece una lectura, profusamente explicado con ejemplos.
Comprobar la validez de tus ficheros de configuración MySQL
MySQL no dispone de una opción de comprobación de ficheros de configuración, como las que puede tener por ejemplo, Apache, por lo que si nos dedicamos a hacer cambios "en caliente" del tipo "SET GLOBAL", es probable que cuando queramos reiniciar o arrancar el servidor MySQL, este se niegue en redondo, por una variable mal escrita, o no soportada por nuestra versión.
Gracias al cielo, para evitar tener que leer y comprobar linea a linea el fichero de configuración, tenemos la opción:
-
[root@server]# /usr/local/libexec/mysqld --help
-
080227 13:19:10 [ERROR] /usr/local/libexec/mysqld: unknown variable 'variable_mal_escrita=1'
OJO: Esto comprobará la correcta asignación de nombres de variables, PERO NO sus valores minimos/máximos
Plugin de búsqueda para Wordpress basado en Sphinx
La gente de MySQL Performance Blog está desarrollando un plugin de búsqueda para Wordpress basado en Sphinx, que planean distribuir como Open Source.
Por el momento lo tienen en producción/test en su propio blog, y están realizando test, escribiendo documentación, etc... pero Peter, el desarrollador, planea tenerlo listo en las próximas semanas. Yo, desde luego, le daré un ojo; No hay que olvidar que antes de montarse por su cuenta, Peter Zaitsev trabajaba como organizador del Grupo de Alto Rendimiento en MySQL AB.