una tablas recomendaciones queries porque para optimizar optimizador lenta las grandes dañan datos cuello consulta como cantidades botella agilizar mysql tags tagging

tablas - inserto anidado en mysql para etiquetar



porque se dañan las tablas en mysql (5)

Me gustaría agregar una etiqueta a un blogpost con una sola declaración sql.

decir que mis tablas se verían de la siguiente manera:

tags +-------+-----------+ | tagid | tag | +-------+-----------+ | 1 | news | | 2 | top-story | +-------+-----------+ tag2post +----+--------+-------+ | id | postid | tagid | +----+--------+-------+ | 0 | 322 | 1 | +----+--------+-------+

El problema que me gustaría resolver es insertar una nueva etiqueta , recuperar su identificación y luego insertar esta nueva identificación en la tabla de relaciones en una única declaración sql.

INSERT INTO tag2post (postid, tagid) VALUES ( 332, # the post IF ( (SELECT tagid FROM tags WHERE tag = ''new_tag''), (SELECT tagid FROM tags WHERE tag = ''new_tag''), # here is where i''d like to insert # the new_tag and return it''s id ''i am lost here'' ) )


En lugar de usar una columna de ID de incremento automático, use una columna GUID. Luego puede generar el GUID antes de ejecutar la declaración y hacer todo al mismo tiempo.

Incluso a Jeff Atwood le gusta este enfoque , y no se aplica una penalización de velocidad significativa por el uso de cadenas de 32 caracteres en lugar de números enteros.

Además, para evitar la duplicación de etiquetas, debe usar la suma MD5 del nombre de la etiqueta como identificación de la etiqueta.


No puede hacer esto como una sola inserción porque las inserciones son atómicas, es decir, la ID no se determina hasta que la declaración se complete.

Envuelva ambas declaraciones en una transacción y obtendrá su ID y atomicidad.


Podría intentar esto, efectivamente haciendo una inserción si no puede seleccionarla, y luego recuperar LAST_INSERT_ID () de la fila insertada, pero dudo seriamente que funcione.

INSERT INTO tag2post (postid, tagid) VALUES ( 332, # the post IF ( (SELECT tagid FROM tags WHERE tag = ''new_tag''), (SELECT tagid FROM tags WHERE tag = ''new_tag''), IF ( (INSERT INTO tags (tag) VALUES (''new_tag'')), LAST_INSERT_ID(), LAST_INSERT_ID() ) ) )


Si usa un campo de incremento no automático y realiza su propio cálculo de incremento, puede determinar cuál será el id. Antes de insertar el campo y especificar los nuevos identificadores manualmente.

Luego puede construir una cadena de instrucciones para cada entrada de tag2post usando estos ids separados por; sy puede enviarlos a msyql para su ejecución.


Creo que tendrías que romperlo. Una forma de hacerlo es agregar la restricción UNIQUE para tag y proceder de la siguiente manera:

INSERT IGNORE INTO tags (tag) VALUE (''new_tag'')

y entonces

INSERT INTO tag2post (postid, tagid) VALUES ( 332, # the post (SELECT tagid FROM tags WHERE tag = ''new_tag'') )

INSERT IGNORE puede no escalarse bien, sin embargo. Entonces, una alternativa es hacer SELECT , si el ID no está allí, INSERT , entonces asegúrese de capturar una excepción aquí si otro hilo / proceso / servicio modificó la tabla entre su SELECT y ahora. En el INSERT , realiza LAST_INSERT_ID() y, si lo encuentra, repite la SELECT inicial ...

No es increíble, pero si la concurrencia es un requisito, debes hacer esto. Las transacciones no aliviarán el problema y si no tiene una restricción UNIQUE en la tag , puede terminar con INSERT duplicadas.