Creare tabele - dureaza mult timp

Buna,

Am o problema cu crearea tabelelor (cu index, foreign keys). Pe calculatorul meu dureaza cam 20-45 secunde pentru un set de creare a tabelelor. Daca fac acest lucru pe un server VPS de pe Digitalocean, va dura 2-5 secunde.

Sistemul de operare pe calculatorul meu este Debian 9. Am testat pe local, docker, VM…, am testat si mai multe versiuni de mysql insa problema este la fel. Am cautat pe google, si cineva spunea ca trebuie pentru [mysqld] sa maresc innodb_buffer_pool_size si alte proprietati, dar acestea nu ajuta la nimic.

Mentionez ca am HDD pe calculatorul meu, iar VPS-ul foloseste SSD. Poate fi acesta motivul problemei mele?

Da, cel mai probabil.

Ok, multumesc.

Prea multe variabile aici: cate tabele, cati indecsi, etc. In functie de numarul lor conteaza sau nu SSD-ul.

17 tabele, 8 indecsi si cam 5 foreign keys.

Ai innodb_file_per_table ON? Conteaza asta ca sa nu ai un fisier ibdata de zeci de Gb, greu de parcurs.

Este.

image

Nu vad un motiv sa dureze mai mult de cateva secunde.

Poti urmari evolutia bazei de date in timpul rularii scriptului? Se creeaza cate un obiect la fiecare x secunde, sau ai o intarziere de cateva zeci de secunde inainte de a crea primul obiect?

Un obiect se creaza in x secunde. Adica un mysql query.

Salut, poti incerca un profiler ca sa vezi poate afli unde este problema.

SET profiling = 1;
CREATE TABLE … ;
SET profiling = 0;

– Cauti id-ul pentru profiler
SHOW PROFILES;

– Obtii informatii pe baza id-ului din SHOW PROFILES;
SHOW PROFILE FOR QUERY N;

Poti verifica si limita de openfiles .

2 Likes

Nu prea inteleg ce-i asta, la ce va ajuta daca fac acest lucru?

Eu nu înțeleg dacă ai problema asta când creezi tabela sau când introduci date în tabelă.

Mi se pare extrem de ciudat ca o instrucțiune de forma CREATE TABLE să dureze mai mult de câteva milisecunde, indiferent de OS sau de hardware.

Poți da un exemplu de interogare care durează 20 secunde?

pai nu toate tabelele sunt create egale.
unele sunt create goale, altele cu date in ele, nu? :slight_smile:

ontopic: eu nu inteleg de ce te deranjeaza 40 de secunde local, cand in staging sau production lucrurile merg ok.

ps. da, diferenta hdd vs. ssd poate fi uneori enorma (depinde si de alte configurari - ex: swap).

Un complet de interogari poate dura 20 de secunde. Sa spunem creare tabele: users, contacts, invoices, histories, products, media. Fiecare mai are 1-2 indecsi si ceva foreign key. Nimic iesi din comun. Iata daca fac run la toate, o sa dureze in jur la 20 secunde.

Atunci cand lucrez, am nevoie sa fac teste, sa fac fresh, reset apoi iar migration, si ma deranjeaza ca trebuie sa astept asa mult.

ai considerat si varianta sa iti setezi mediul dev tot pe digital ocean?
daca lucrezi pe linux e cu atat mai simplu (cu un ssh-key lucrurile merg ca si cum ar fi local dpdv al comoditatii, iar avantajele sunt multiple: te poti conecta si de pe desktop si de pe laptop, aplicatia e mereu online si poate fi testata si de terti, integrarile cu diferite alte tooluri online e mult mai simpla, etc).

Am incercat, pana se conecteaza la digitalocean dureaza cam 1-2 secunde, dupa conectare totul merge perfect. Problema este ca conexiunea se finiseaza cand primesc raspuns, iar daca vreu sa mai fac un request,iar trebuie sa astept 1-2 secunde pana se conecteaza.
Apropo, stie cineva de ce se intampla asa si daca este vreo solutie?

pai depinde si de ce unelte folosesti.
eu lucrez frecvent cu dev in digitalocean si totul se conecteaza mai bine decat pe local :slight_smile:
daca ne referim strict la baza de date… putem analiza optiunile:

  • te conectezi cu terminal si apoi de acolo lucrezi in linia de comanda (esti deja conectat, poti sa faci cate interogari vrei)
  • folosesti un tool gui (gen navicat - pentru care ai nevoie de licenta - sau ceva simila free) si ai optiunea de conectare prin ssh (port 22, nu 3306) si de acolo se interogheaza catre localhost.
  • oricare alta varianta, in functie de preferinte.

cred ca trebuie sa iti stabilesti mai intai nevoile de lucru si apoi sa cauti / testezi varianta care functioneaza pentru tine.
personal, prefer sa nu ma impiedic in timpi din astia de 1-2 secunde sau de 40-45 de secunde (dureaza mai mult sa caut si sa testez rezolvari care s-ar putea sa nu mearga), dar daca se intampla asta frecvent… atunci poate sa fie incomod sau chiar o problema reala.

ideea e ca la intrebarea ta nu prea avem cum sa avem idee de raspuns daca nu cunoastem contextul.

Intrebare poate idioata, dar creezi acele tabele si cu ceva date in ele, sau sunt goale?
Poate este si aia o posibila cauza.

Am avut si eu lag in consola tot de cam 1-2 secunde. Vezi sa ai server-ul prin Europa. Eu la DO in am intr-un datacenter din Frankfurt. Ca daca este prin SUA ai lag.

Sunt goale. Pur si simplu creez tabelele.

De exemplu in laravel, am setat datele de logare pentru mysql am setat la host ip-ul serverului de pe digitalocean. Cand incerc sa fac un http-request, evident ca va aplicatia mea va face conexiune cu baza de date si apoi query.

aplicatia e local si baza de date remote?
le impiedica ceva sa fie ambele in digitalocean si sa faca interogarea catre localhost?