11.05.2013 Views

Bases de datos en MySQL

Bases de datos en MySQL

Bases de datos en MySQL

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

© FUOC • P06/M2109/02151 33 <strong>Bases</strong> <strong>de</strong> <strong>datos</strong> <strong>en</strong> <strong>MySQL</strong><br />

Vamos a int<strong>en</strong>tar mejorar esta consulta. Vemos que <strong>en</strong> la tabla precios no se<br />

ha <strong>de</strong>finido ningún índice, lo que facilitaría la labor al SGBD:<br />

mysql> alter table precios add in<strong>de</strong>x empresa_idx (empresa);<br />

Query OK, 20 rows affected (0.00 sec)<br />

Records: 20 Duplicates: 0 Warnings: 0<br />

mysql> alter table precios add in<strong>de</strong>x clave_idx (clave);<br />

Query OK, 20 rows affected (0.00 sec)<br />

Records: 20 Duplicates: 0 Warnings: 0<br />

mysql> explain select productos.clave, concat(parte,' ',tipo,' ', especificación) as producto,<br />

proveedores.empresa , precio , pago from productos natural join precios natural join proveedores;<br />

+-------------+--------+-----------------------+-------------+---------+--------------+-----+-----------+<br />

| table | type | possible_keys | key | key_l<strong>en</strong> | ref |rows | Extra |<br />

+-------------+--------+-----------------------+-------------+---------+--------------+-----+-----------+<br />

| proveedores | ALL | PRIMARY | NULL | NULL | NULL | 3 | |<br />

| precios | ref | empresa_idx,clave_i<strong>de</strong>x| empresa_idx | 20 | productos.emp| 7 | |<br />

| productos | eq_ref | PRIMARY | PRIMARY | 4 | precios.clave| 1 | |<br />

+-------------+--------+-----------------------+-------------+---------+--------------+-----+-----------+<br />

3 rows in set (0.00 sec)<br />

Las cosas han cambiado sustancialm<strong>en</strong>te. El gestor ha pasado <strong>de</strong> leer 24 filas<br />

<strong>de</strong> <strong>datos</strong>, a leer 11. También ha cambiado el or<strong>de</strong>n <strong>de</strong> lectura <strong>de</strong> las tablas, haci<strong>en</strong>do<br />

primero una lectura total <strong>de</strong> la tabla proveedores (que es inevitable ya<br />

que no hemos puesto ninguna condición <strong>en</strong> el SELECT) y, <strong>de</strong>spués, ha aprovechado<br />

los índices <strong>de</strong>finidos <strong>en</strong> 'precios' y <strong>en</strong> 'productos'.<br />

4.3. Manipulación <strong>de</strong> filas<br />

Para la manipulación <strong>de</strong> filas disponemos <strong>de</strong> las s<strong>en</strong>t<strong>en</strong>cias SQL INSERT, UP-<br />

DATE y DELETE, su uso y sintaxis ya se ha visto <strong>en</strong> el módulo 3 <strong>de</strong> este curso.<br />

En algunos casos, <strong>MySQL</strong> nos proporciona ext<strong>en</strong>siones o modificadores que<br />

nos pue<strong>de</strong>n ayudar mucho <strong>en</strong> <strong>de</strong>terminadas situaciones.<br />

• INSERT [DELAYED]. Cuando la s<strong>en</strong>t<strong>en</strong>cia INSERT pue<strong>de</strong> tardar mucho <strong>en</strong><br />

<strong>de</strong>volver el resultado (tablas muy gran<strong>de</strong>s o con muchos índices que <strong>de</strong>b<strong>en</strong><br />

recalcularse al insertar una nueva fila) pue<strong>de</strong> ser interesante añadir la palabra<br />

clave DELAYED para que <strong>MySQL</strong> nos <strong>de</strong>vuelva el control y realice la inserción<br />

<strong>en</strong> segundo plano.<br />

• INSERT [[LOW_PRIORITY] | [HIGH_PRIORITY]]. En tablas muy ocupadas,<br />

don<strong>de</strong> muchos cli<strong>en</strong>tes realizan consultas constantem<strong>en</strong>te, una inserción<br />

l<strong>en</strong>ta pue<strong>de</strong> bloquear al resto <strong>de</strong> cli<strong>en</strong>tes durante un tiempo. Mediante estos<br />

modificadores po<strong>de</strong>mos variar este comportami<strong>en</strong>to.<br />

• INSERT [IGNORE]. Este modificador convierte los errores <strong>de</strong> inserción <strong>en</strong><br />

avisos. Por ejemplo, si int<strong>en</strong>tamos insertar una fila que duplica una clave<br />

primaria exist<strong>en</strong>te, el SGBD nos <strong>de</strong>volverá un aviso (y no insertará la nueva<br />

fila), pero nuestro programa cli<strong>en</strong>te podrá continuar con su cometido si el<br />

resultado <strong>de</strong> la inserción no era importante para su correcta ejecución.<br />

Veremos más sobre los índices<br />

<strong>en</strong> el subapartado 5.5 “Análisis<br />

y optimización” <strong>de</strong> esta unidad<br />

didáctica.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!