Avatar billede shjorth Nybegynder
24. november 2009 - 21:33 Der er 19 kommentarer og
1 løsning

Opdele een mysql database i flere

Hejsa

Jeg har hørt at når man begynder at få et rigtig stort load på sin mysql database kan det betale sig at opdele denne til flere "clone" databaser, hvor man skriver til en anden end man læser.

Jeg har dog lidt svært ved at forstå hvordan dette skal kunne fungere, er der nogen der kender til en guide, eller måske selv er eksperter på det område?

Mange tak
Avatar billede arne_v Ekspert
24. november 2009 - 21:38 #1
Det fungerer saadan:
- man har N MySQL servere
- 1 er master og N-1 er slaver
- alle opdateringer sendes til master
- opdateringer replikeres fra master til slaver
- forespoergslerne fordeles ud paa de N-1 slaver
Avatar billede arne_v Ekspert
24. november 2009 - 21:40 #2
Du faar foerst brug for den slags, naar du har et ret stort setup.

Jeg vil tro ca. naar du passerer 100000 USD pris skiltet for din database server.
Avatar billede shjorth Nybegynder
24. november 2009 - 21:46 #3
Er det noget der vil kræve noget af selve koden? Eller sende scriptet stadig til samme server som så "distribuerer" ?
Avatar billede arne_v Ekspert
24. november 2009 - 21:54 #4
Der er flere muligheder:

1)  Man kan styre det programmatisk fra kode.

2)  Man kan connecte til IP addressen paa en load balancer som distribuerer ud til flere servere bag den.

3)  Man kan bruge en smart driver.

Jeg tror ikke at PHP mysql og mysqli kan det. Men Java JDBC driveren kan lave finde ud af om der skal sendes til master eller loadbalances til flere slaves. Se http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-replication-connection.html for eksempel.
Avatar billede shjorth Nybegynder
24. november 2009 - 22:11 #5
Okay, på dèn måde. Mange tak.

Så har jeg endnu et spørgsmål.

Hvilken DB form er den hurtigste? Jeg har læst mig til at det ihvertfald ikke er MyIsam, som jeg kører.

Men i så fald hvilken er den hurtigste, og hvad vil det egentlig kræve at ændre en MyIsam db til xx ?

Igen mange tak
Avatar billede shjorth Nybegynder
24. november 2009 - 22:45 #6
Okay, jeg er kommet frem til at man på en måde skal opdele sin kode sådan at man skriver et sted, og henter et andet.

Spørgsmålet er hvorledes man gør det, hvis f.eks min kode ser således ud:

$q = mysql_query("SELECT id FROM noget LIMIT 1")or die(mysql_error());

// Print id

mysql_query("UPDATE noget SET `id`=`id`+1 WHERE id = '".$row['id']."'")or die(mysql_error());

Er der en ekstra variabel man så kaster ind i det ovenstående for at vælge hvilken db/server den så skal skrive til?

Undskyld dumme spørgsmål :)
Avatar billede arne_v Ekspert
25. november 2009 - 00:07 #7
MyISAM anses normalt som den hurtigste storage engine fordi den ikke bruger log file.

InnoDB bruger log fil. Det er noedvendigt for at understoette transaktioner men koster noget i performance.
Avatar billede arne_v Ekspert
25. november 2009 - 00:09 #8
Du skal eksplicit angive connection fremfor at bruge default.

Altsaa:

$selcon = mysql_connect(bla bla);
$updcon = mysql_connect(bla bla);
...
$q = mysql_query("SELECT id FROM noget LIMIT 1", $selcon)or die(mysql_error());
...
mysql_query("UPDATE noget SET `id`=`id`+1 WHERE id = '".$row['id']."'", $updcon)or die(mysql_error());
Avatar billede arne_v Ekspert
25. november 2009 - 00:10 #9
Meget vigtigt: skift til mysqli og prepared statement

Lidt vigtigt: drop de ``
Avatar billede shjorth Nybegynder
25. november 2009 - 00:23 #10
mysqli_query(".....

Således? og hvilken forskel vil det gøre?

` er også en dårlig ide? Noget det ændrer på "performance"
Avatar billede arne_v Ekspert
25. november 2009 - 00:27 #11
Avatar billede arne_v Ekspert
25. november 2009 - 00:28 #12
Det beskytter mod SQL injection og vil i nogen tilfaelde give bedre performance.
Avatar billede arne_v Ekspert
25. november 2009 - 00:28 #13
`` er bare unoedvendigt hvis man vaelger nogle gode navne og en pine hvis man en dag skal skifte database tIl SQLServer eller en anden database.
Avatar billede shjorth Nybegynder
25. november 2009 - 01:12 #14
Du nævnte ordet performance.. Det kan jeg godt lide.

Jeg beskytter mine strenge med mysql_real_escape_string

Men skal jeg konvertere til mysqli, så skal en streng som denne:

$q = mysql_query("
$row = mysql_fetch_array(

altså ændres til

$q = mysql_prepare("
$row = mysqli_stmt_fetch(

Jeg spørger blot for at være helt sikker :)

Igen mange mange tak for hjælpen
Avatar billede arne_v Ekspert
25. november 2009 - 01:55 #15
Prepared statement er lidt bedre end real escape til at beskytte mod SQL injection.

Nej - du skal lave kaldene lidt anderledes - check eksemplerne i det link jeg gav.

Jeg kan evt. godt lige prøve og bixe et eksempel selv også.
Avatar billede shjorth Nybegynder
25. november 2009 - 02:43 #16
Hvis du har tid og lyst til dig, ville jeg blive meget glad for at se præcis hvorledes :-)

Hvis mysqli på nogen måde kan optimere min performance, så er det helt klart det der skal til..
Avatar billede arne_v Ekspert
25. november 2009 - 03:58 #17
Eksempel:

old style:

<?php
    $con = mysql_connect('localhost', 'root', '') or die(mysql_error());
    mysql_select_db('Test', $con) or die(mysql_error());
    $v = 'BB';
    $query = mysql_query('SELECT f1 FROM t1 WHERE f2 = \'' . mysql_real_escape_string($v) . '\'', $con) or die(mysql_error());
    while($row = mysql_fetch_array($query)) {
        print $row['f1'] . "\n";
    }
    mysql_close($con);
?>

new style:

<?php
    $con = new mysqli('localhost', 'root', '', 'Test');
    if(mysqli_connect_errno()) die(mysqli_connect_error());
    if($stmt = $con->prepare('SELECT f1 FROM t1 WHERE f2 = ?')) {
        $stmt->bind_param('s', $v);
        $v = 'BB';
        $stmt->execute();
        $stmt->store_result();
        $stmt->bind_result($f1);
        while ($stmt->fetch()) {
            print $f1 . "\n";
        }
        $stmt->close();
    } else {
        die($con->error);
    }
    $con->close();
?>
Avatar billede arne_v Ekspert
25. november 2009 - 04:06 #18
Med hensyn til performance og prepared statement så læs:
  http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html
  http://www.mysqlperformanceblog.com/2006/08/02/mysql-prepared-statements/

Der er ikke garanti for at prepared statement altid er hurtigere.

Faktisk er det min erfaring at det med ældre MySQL og PHP ofte er langsommere.

Men fordelene med prepared statement bør blive større jo nyere MySQL og PHP.
Avatar billede shjorth Nybegynder
03. december 2009 - 21:25 #19
Mange tak. Smider du et svar?
Avatar billede arne_v Ekspert
03. december 2009 - 22:20 #20
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester