10 dicas estúpidas para o MySQL

You are able to see this post in english too.

Olá!

O post deste mês traz 10 dicas estúpidas para o dia-a-dia com o MySQL. Lá vão elas:

  1. Utilize um arquivo .my.cnf em sua homedir com dados de user/senha:
    [client]
    user=root
    password=mi-nha_s3nha
  2. Termine os comandos com G ao invés de “;”: Isso lhe dará uma visão “form” ao invés de tabular. Necessário muitas vezes;
  3. Visões materializadas: Quando as Views não oferecerem a performance esperada, utilize triggers para alimentar tabelas que lhe servirão como views. Utilizando este recurso com cuidado, teste e documentação, ajuda bastante!
  4. Cuide do parâmetro ENGINE de seus bancos e tabelas: Escolha o melhor considerando a relação de R/W entre elas;
  5. Personalize o prompt do MySQL no arquivo .my.cnf de sua homedir. O exemplo abaixo mostrará "MySQL:db_exemplo>". Existem também os parâmetros u para o user e h para o host:
    prompt='mysql:d>'
  6. Uma vez no prompt do MySQL, CTRL+A te leverá ao início da linha, CTRL+E ao final.
  7. Para criar uma tabela t2 com a mesma estrutura da tabela t1:
    CREATE TABLE t2 LIKE t1;
  8. Para criar um usuário e dar acesso numa única linha:
    GRANT ALL ON db_name.* TO 'username'@'host' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
  9. Gerar um arquivo CSV a partir do shell (melhor que OUTFILE pois leva o nome das colunas também):
    mysql -AD dbname -e "Seu SELECT aqui;" | tr "t" ";" > resultset.csv
  10. Agora a última, mas não menos estúpida. Exibir as queries em execução (o parâmetro FULL é opcional):
    SHOW [FULL] PROCESSLIST;

Memorizá-las tornará seu dia-a-dia com o MySQL mais fácil.

Até a próxima!!

10 stupid tips for MySQL

Você pode ler este post em português também.

Hello!

The April’s post brings 10 stupid tips for day-by-day work with MySQL. Let’s see them:

  1. Use a .my.cnf file in your homedir with user/password data:
    [client]
    user=root
    password=my_p@ss-w0rd
  2. End your commands with G instead of ";": This will bring a “form” view instead the normal tabular view. This is necessary a lot of times;
  3. Materialized views: When the regular views (created with CREATE VIEW) doesn’t offer the expected performance, use triggers to feed tables that could work like the regular views. Being carefull, it helps a lot!
  4. Take care of the parameter ENGINE of your databases and tables: Choose the best considering the R/W relation of the tables;
  5. Adjust your MySQL prompt to your best fit at your .my.cnf in your homedir. The example below shows "mysql:db_name>". There are also the u (to show the username) and h (to show the hostname):
    prompt='mysql:d>'
  6. At your mysql prompt, CTRL+A brings you to the begin of the line. CTRL+E brings you to the end;
  7. To create a t2 table with the same structure of t1 table:
    CREATE TABLE t2 LIKE t1;
  8. To create a user and give its access in one line:
    GRANT ALL ON db_name.* TO 'username'@'host' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
  9. To generate a CSV file from the shell (better than OUTFILE ’cause this below shows the column names):
    mysql -AD dbname -e "Your SELECT here;" | tr "t" ";" > resultset.csv
  10. And the last, but not least (stupid). To show the queries in execution (the FULL parameter is optional):

    SHOW [FULL] PROCESSLIST;

Memorize them and your day-by-day with MySQL will be easier.

See you!

MySQL: Copy only the structure of table

Você pode ler este post em português também.

Hello!

Last month I had to copy the structure of a table to a new one. More than two people were surprised with the way and ease which I did it, so I decided to post it here instead of another performance comparison inside PHP.

Below is an example. Enjoy and feel free to share ideas about it.

[arglbr@t64 ~]$ mysql -AD test
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 20
Server version: 5.1.47 Source distribution

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> CREATE TABLE `test`.`t1` (
-> `id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
-> `name` VARCHAR(50) NOT NULL,
-> PRIMARY KEY (`id`),
-> INDEX `idx_01`(`name`)
-> ) ENGINE = InnoDB;
Query OK, 0 rows affected (0.10 sec)

mysql> insert into t1 values (1, 'Adriano'), (2, 'Andréa'), (3, 'Arlete');
Query OK, 3 rows affected (0.04 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from t1;
+----+---------+
| id | name |
+----+---------+
| 1 | Adriano |
| 2 | Andréa |
| 3 | Arlete |
+----+---------+
3 rows in set (0.00 sec)

mysql> create table t2 like t1;
Query OK, 0 rows affected (0.10 sec)

mysql> select * from t2;
Empty set (0.00 sec)

mysql> show create table t1;
+-------+---------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------+
| t1 | CREATE TABLE `t1` ( |
| `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, |
| `name` varchar(50) NOT NULL, |
| PRIMARY KEY (`id`), |
| KEY `idx_01` (`name`) |
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create table t2;
+-------+---------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------+
| t2 | CREATE TABLE `t2` ( |
| `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, |
| `name` varchar(50) NOT NULL, |
| PRIMARY KEY (`id`), |
| KEY `idx_01` (`name`) |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------+
1 row in set (0.00 sec)

mysql>

As you can see, it’s an interesting method because it gets all the structure (índex, engine, encoding) e naturally, reset the AUTO_INCREMENT atribute.

Cheers!

MySQL: Copiar somente estrutura de uma tabela

You can see this post in english too.

Olá!

No último mês precisei copiar a estrutura de uma tabela para uma nova. Como mais de duas pessoas ficaram surpresas com a forma e facilidade com a qual fiz isso, decidi publicá-la aqui ao invés de realizar outra comparação de performance com o PHP.

Segue abaixo o exemplo. Divirta-se e sinta-se à vontade para compartilhar idéias sobre isso.


[arglbr@t64 ~]$ mysql -AD test
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 20
Server version: 5.1.47 Source distribution

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> CREATE TABLE `test`.`t1` (
-> `id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
-> `name` VARCHAR(50) NOT NULL,
-> PRIMARY KEY (`id`),
-> INDEX `idx_01`(`name`)
-> ) ENGINE = InnoDB;
Query OK, 0 rows affected (0.10 sec)

mysql> insert into t1 values (1, 'Adriano'), (2, 'Andréa'), (3, 'Arlete');
Query OK, 3 rows affected (0.04 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from t1;
+----+---------+
| id | name |
+----+---------+
| 1 | Adriano |
| 2 | Andréa |
| 3 | Arlete |
+----+---------+
3 rows in set (0.00 sec)

mysql> create table t2 like t1;
Query OK, 0 rows affected (0.10 sec)

mysql> select * from t2;
Empty set (0.00 sec)

mysql> show create table t1;
+-------+---------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------+
| t1 | CREATE TABLE `t1` ( |
| `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, |
| `name` varchar(50) NOT NULL, |
| PRIMARY KEY (`id`), |
| KEY `idx_01` (`name`) |
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create table t2;
+-------+---------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------+
| t2 | CREATE TABLE `t2` ( |
| `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, |
| `name` varchar(50) NOT NULL, |
| PRIMARY KEY (`id`), |
| KEY `idx_01` (`name`) |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------+
1 row in set (0.00 sec)

mysql>

Como vê, este método é interessante pois traz somente a a estrutura (índices, engine, encoding) e naturalmente, reseta o valor AUTO_INCREMENT.

 

Até!