INSERT de MySQL: el límite en Laravel

[vc_row el_class=”blog-info”][vc_column][vc_single_image source=”featured_image” img_size=”full” style=”vc_box_rounded”][vc_empty_space height=”40px”][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text el_class=”font-weight-bold”]

Laravel, el límite INSERT de MySQL

Haciendo algunos DB Seeders surgió un problema porque estaba generando valores y almacenándolos en una matriz, luego insertándolos todos a la vez y luego el INSERT fallaría.

¡Hoy vamos a investigar qué limitaciones tiene!

Considere que tenemos la siguiente tabla:

INSERT

[/vc_column_text][vc_empty_space height=”40px”][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text]


Insertemos 1000 registros a la vez y veamos los resultados, nos detendremos en 100000 registros.

En el primer intento, se detuvo en 45k

INSERTED: 1000 time(s): 0.0094678401947021
INSERTED: 2000 time(s): 0.011389970779419
INSERTED: 3000 time(s): 0.016204833984375
INSERTED: 4000 time(s): 0.022641897201538

INSERTED: 44000 time(s): 0.19947600364685
INSERTED: 45000 time(s): 0.28028988838196

FatalError: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2097160 bytes)

Lo comencé de nuevo y el punto de partida cambió de 1k a 64k

INSERTED: 46000 time(s): 0.22972512245178
INSERTED: 47000 time(s): 0.24145197868347
INSERTED: 48000 time(s): 0.21563100814819

INSERTED: 60000 time(s): 0.29563403129578
INSERTED: 61000 time(s): 0.2987060546875
INSERTED: 62000 time(s): 0.29574394226074

FatalError: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2097160 bytes)

Mismo problema. Es hora de deshabilitar mi límite de memoria de php.ini

¡Probar el número tres!

INSERTED: 1000 time(s): 0.0098659992218018
INSERTED: 2000 time(s): 0.0082449913024902
INSERTED: 3000 time(s): 0.016316890716553
INSERTED: 4000 time(s): 0.020424127578735

INSERTED: 63000 time(s): 0.29119181632996
INSERTED: 64000 time(s): 0.31178092956543
INSERTED: 65000 time(s): 0.32407689094543

Y luego … fallar.

 

QueryException: SQLSTATE[HY000]: General error: 1390 Prepared statement contains too many placeholders…

 

¡Parece que realmente hay un límite! Bien, busquemos entonces. Debería estar entre 65000 y 66000 registros en un INSERT.

Ahora los he repetido insertando 65010, 65020, 65030, y así sucesivamente hasta el primer fallo. Luego llegó al primer número significativo 65530. A partir de ahí he empezado a insertarlos uno por uno…

Y en la final, el límite de INSERT es: 65536 que en realidad es 2 elevado a 16

Idealmente, MySQL permite un número infinito de filas en una declaración INSERT, pero si MySQL Client recibe un paquete más grande que max_allowed_packet (65,636 bytes para MariaDB), arroja un error de paquete demasiado grande y termina la conexión.

Puede omitir esto haciendo esto:

SET GLOBAL max_allowed_packet=524288000; //bytes; SETS TO 500MB

O lo que sea que se adapte a sus necesidades, pero buscaría otras alternativas antes de hacer esto porque establece una configuración GLOBAL.

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row el_class=”social-info”][vc_column width=”1/6″][/vc_column][vc_column width=”2/3″][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text][social_share_button themes=’theme1′][/vc_column_text][/vc_column_inner][vc_column_inner el_class=”youtube-inner-col” width=”1/2″][vc_column_text][likebtn theme=”youtube” lang=”auto” show_like_label=”0″ white_label=”1″ alignment=”right”][/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner el_class=”social-info-inner”][vc_column_inner width=”1/4″][vc_single_image image=”921″][/vc_column_inner][vc_column_inner width=”3/4″][vc_column_text]

Diego Pacheco

Ingeniero en Sitemas, MBA (Babson College). Desarrollador PHP/Java/JavaScript. Fundador & CEO de EpicStudio. Entusiasta de las tecnologías web (JavaScript, Vue, Laravel, AWS, Docker) Viajes, Negocios, Surf y Growth.[/vc_column_text][asvc_list_item icon_fontawesome=”fa fa-calendar-o” icon_size=”14px”]Programar una reunión[/asvc_list_item][/vc_column_inner][/vc_row_inner][/vc_column][vc_column width=”1/6″][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Recent Post

[/vc_column_text][lvca_posts_carousel posts_query=”size:3|order_by:rand|post_type:post” image_linkable=”true” image_size=”full” taxonomy_chosen=”post_tag” display_title=”true” display_post_date=”true” display_summary=”true” autoplay_speed=”3000″ animation_speed=”300″ display_columns=”3″ scroll_columns=”3″ gutter=”3″ tablet_display_columns=”2″ tablet_scroll_columns=”2″ tablet_gutter=”3″ tablet_width=”800″ mobile_display_columns=”1″ mobile_scroll_columns=”1″ mobile_gutter=”3″ mobile_width=”480″][vc_empty_space height=”20px”][/vc_column][/vc_row]