Mostrando entradas con la etiqueta world. Mostrar todas las entradas
Mostrando entradas con la etiqueta world. Mostrar todas las entradas

martes, 28 de enero de 2014

Utilice el índice incluso con un varchar | | caracteres

Original post: http://anothermysqldba.blogspot.com/2014/01/use-your-index-even-with-varchar-char.html

Hace poco me di cuenta de un post en el forums.mysql.com sitio: Cómo búsqueda rápida en 3 millones de registro? 
El ejemplo que utiliza un LIKE '% eed' 

Eso no será aprovechado de un índice y hará un escaneo completo de tabla. 
A continuación se muestra un ejemplo que utiliza la base de datos mundial, por lo que no de 3 millones de discos, pero tratando de mostrar cómo funciona. 

> explain select * from City where Name LIKE '%dam' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4188
Extra: Using where
1 row in set (0.01 sec)

[world]> select count(*) FROM City;
+----------+
| count(*) |
+----------+
| 4079 |
+----------+

> select * from City where Name LIKE '%dam';
+------+------------------------+-------------+----------------+------------+
| ID | Name | CountryCode | District | Population
+------+------------------------+-------------+----------------+------------+
| 5 | Amsterdam | NLD | Noord-Holland | 731200 |
| 6 | Rotterdam | NLD | Zuid-Holland | 593321 |
| 1146 | Ramagundam | IND | Andhra Pradesh | 214384 |
| 1318 | Haldwani-cum-Kathgodam | IND | Uttaranchal | 104195 |
| 2867 | Tando Adam | PAK | Sind | 103400 |
| 3122 | Potsdam | DEU | Brandenburg | 128983 |
+------+------------------------+-------------+----------------+------------+
Para mostrar el punto más 

> explain select * from City where Name LIKE '%dam%' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4188
Extra: Using where
1 row in set (0.00 sec)

> select * from City where Name LIKE '%dam%';
+------+------------------------+-------------+----------------+------------+
| ID | Name | CountryCode | District | Population |
+------+------------------------+-------------+----------------+------------+<
| 5 | Amsterdam | NLD | Noord-Holland | 731200 |
| 6 | Rotterdam | NLD | Zuid-Holland | 593321 |
| 380 | Pindamonhangaba | BRA | São Paulo | 121904 |<
| 625 | Damanhur | EGY | al-Buhayra | 212203 |
| 1146 | Ramagundam | IND | Andhra Pradesh | 214384 |
| 1318 | Haldwani-cum-Kathgodam | IND | Uttaranchal | 104195 |
| 1347 | Damoh | IND | Madhya Pradesh | 95661 |
| 2867 | Tando Adam | PAK | Sind | 103400 |
| 2912 | Adamstown | PCN | – | 42 |
| 3122 | Potsdam | DEU | Brandenburg | 128983 |
| 3177 | al-Dammam | SAU | al-Sharqiya | 482300 |
| 3250 | Damascus | SYR | Damascus | 1347000 |
+------+------------------------+-------------+----------------+------------+<
12 rows in set (0.00 sec) 

La salida de explicación anterior muestra que no se utilizan índices. 

CREATE TABLE `City` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`CountryCode` char(3) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`),
CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `Country` (`Code`)
) ENGINE=InnoDB
<

Así que para las muecas pongamos una tecla en el campo varchar. Note que no pongo una tecla en todo el rango de sólo los primeros caracteres. Esto es, por supuesto, depende de sus datos. 

> ALTER TABLE City ADD KEY name_key(`Name`(5));
Query OK, 0 rows affected (0.54 sec)

CREATE TABLE `City` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`CountryCode` char(3) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`),
KEY `name_key` (`Name`(5)),
CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `Country` (`Code`)
) ENGINE=InnoDB

Lo mismo ocurrirá con esta siquiera importa? 

> explain select * from City where Name LIKE '%dam' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4188
Extra: Using where
1 row in set (0.00 sec) 

No, no importa, porque el LIKE '% presa' obligará a un análisis completo de todos modos. 

> EXPLAIN select * from City where Name LIKE '%dam' AND CountryCode = 'IND' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: ref
possible_keys: CountryCode
key: CountryCode
key_len: 3
ref: const
rows: 341
Extra: Using index condition; Using where
1 row in set (0.00 sec) 

Note la diferencia en el resultado de explicar anteriormente. Esta consulta utiliza un índice.No está utilizando el nombre que el índice pero que está utilizando un índice. Entonces, ¿cómo puede usted tomar ventaja del índice varchar? 

> EXPLAIN select * from City where Name LIKE 'Ra%' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
type: range
possible_keys: name_key
key: name_key
key_len: 5
ref: NULL
rows: 35
Extra: Using where
1 row in set (0.00 sec) 

La consulta anterior se utilizará el índice name_key. 

El punto es que usted tiene que tener cuidado de la forma de escribir la consulta SQL y asegurarse de que se ejecuta explica a encontrar el mejor índice de elección para su búsqueda.

martes, 23 de julio de 2013

MySQL Bases de datos de ejemplo

Original post http://anothermysqldba.blogspot.com/2013/07/mysql-sample-databases.html

Vi un post en el forums.mysql.com página web sobre las bases de datos de muestra y pensé que podría valer la pena un post para dar una visión general rápida de las de los demás.

Las bases de datos de ejemplo se puede encontrar aquí: http://dev.mysql.com/doc/index-other.html
Puede cargar estas bases de datos a través de la línea de comandos de MySQL:

$ tar -vxf sakila-db.tar.gz
$cd sakila-db
$ mysql -u root -p < sakila-schema.sql
Enter password:
$ mysql -u root -p < sakila-data.sql
Enter password:

$ gzip -d world_innodb.sql.gz
$ mysql -u root -p -e "DROP SCHEMA IF EXISTS world";
Enter password:
$ mysql -u root -p -e "CREATE SCHEMA world";
Enter password:
$ mysql -u root -p world < world_innodb.sql
Enter password:

Usted consigue la idea. Base de datos de ejemplo Sakila tiene SCHEMA quitan y crean comandos de esquema en el archivo así que no tienes que hacer ese paso de ese esquema.

También puede usar MySQL Workbench para cargar estos datos.
  • Crear un controlador de conexión para la base de datos.
  • Utilice este identificador de conexión de nueva creación para establecer una instancia de Administration Server.
  • Haga doble clic en la nueva instancia.
  • Según los datos de exportación / Restaurar debería ver una importación de datos.
  • Importar de un archivo autónomo
    • Ruta del archivo será la ubicación de su sakila-schema.sql repita para sakila-data.sql
    • Puede seleccionar un esquema o crear uno nuevo en el caso de mundo.
    • Seleccione Inicio importación y entonces usted estará en la vista Import Progress.
Ahora tiene acceso a las bases de datos de ejemplo en su base de datos.

$ mysql -u root -p
> Uso sakila
> SHOW TABLES;
> Select * from límite actor de 3;
+ ---------- + ------------ + ----------- + ------------- -------- +
| Actor_id | FIRST_NAME | apellidos | last_update |
+ ---------- + ------------ + ----------- + ------------- -------- +
| 1 | PENELOPE | GUINNESS | 2006-02-15 04:34:33 |
| 2 | NICK | WAHLBERG | 2006-02-15 04:34:33 |
| 3 | ED | CHASE | 2006-02-15 04:34:33 |
+ ---------- + ------------ + ----------- + ------------- -------- +
Via banco de trabajo:
  • Cierre la pestaña de administración
  • Seleccione el controlador de conexión bajo el Desarrollo SQL
  • Usted puede simplemente escribir select * from límite actor de 3, y golpear el perno de la iluminación.
  • O bien, puede escribir parte del comando y haga doble clic en el nombre de tabla o nombres de las columnas para que se pueblan los nombres para usted. A continuación, seleccione el perno de la iluminación.
Ahora se dispone de datos para empezar a jugar y aprender con.

Si desea agregar tablas para ello se puede utilizar la línea de comandos MySQL o Desarrollo de SQL y haga clic derecho en "Tablas" en el marco del esquema de su elección y "crear una nueva mesa"