662 Aufrufe
Gefragt in Datenbanken von noahsraven Einsteiger_in (37 Punkte)
Hi,

erstmal die Vorgeschichte zum besseren Verständnis:
Ich habe hier eine Datenbank in der ich die Navigationspunkte aus
meinen alten Navi's zusammengefügt habe.
Dort möchte ich die Dupletten raus haben
Das ganze habe ich erst an einer kleineren Testdatenbank-Tabelle
namens Kartenpunkte-Test mit etwa nur 8800 Datensätzen getestet.
Die Spalte BG beinhaltet dabei Breitengrad, ~minute, ~sekunde
Die Spalte LG beinhaltet dabei Längengrad, ~minute, ~sekunde
Dazu habe ich diesen Befehl (in der MySQL-Shell, weil PHPMyAdmin
spackte aufgrund der PHP-Limits) benutzt:

DELETE FROM `Kartenpunkte-Test`
USING `Kartenpunkte`, `Kartenpunkte-Test` as tmpcomment
WHERE NOT `Kartenpunkte-Test`.ID = tmpcomment.ID
    AND `Kartenpunkte-Test`.ID > tmpcomment.ID
    AND `Kartenpunkte-Test`.BG = tmpcomment.BG
    AND `Kartenpunkte-Test`.LG = tmpcomment.LG;

Das Resultat war: Query OK, 618 rows affected (2 min 38,80 sec)

Den gleichen Befehl habe ich nun für eine Tabelle Kartenpunkte1 mit
etwa 716.000 Datensätze eingesetzt.
Und damit begann das Elend.
Der Befehl läuft nun lt. PHPMyAdmin schon über 14 Stunden und steht
permanent auf dem Status "Sending Data", erhöht beim aktualisieren
aber stetig die Laufzeit.
Unter "top" und "ps" sehe ich leider nur die offene MySQL-Shell die
nunmal sogar noch länger läuft
Diese scheint den Server auch nicht voll auzulasten.
Siehe Shellauszüge:

root@testserver:~# top
top - 09:44:40 up 7 days, 42 min,  2 users,  load average: 1,03, 1,04,
1,05
Tasks: 100 total,   1 running,  99 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0,3 us,  0,7 sy,  0,0 ni, 98,7 id,  0,3 wa,  0,0 hi,  0,0 si,  0,0 st
%Cpu1  : 56,1 us, 43,9 sy,  0,0 ni,  0,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
KiB Mem:   4056204 total,  2368816 used,  1687388 free,    79844
buffers
KiB Swap:  7812092 total,        0 used,  7812092 free.  1638652 cached
Mem

PID    USER    PR    NI    VIRT    RES    SHR    S    %CPU   
%MEM    TIME+    COMMAND
1024    mysql    20    0    1568880    506016    12660    S    100,1   
12,5     823:06.08    mysqld
31590    root    20    0    0    0    0    S    0,3    0,0       0:00.62   
kworker/1:2
1    root    20    0    28608    4756    3068    S    0,0    0,1      
0:22.51    systemd
.........
.........
root@testserver:~# ps fax | [xurl=https://supportnet.de/faqsthread/1045|Sonderzeichen für grep maskieren oder escapen]grep[/url] mysql
29159 pts/0    S+     0:00  |       \_ mysql -u root -p
31690 pts/1    S+     0:00          \_ grep mysql
    534 ?        Ss       0:00        /bin/sh /usr/bin/mysqld_safe
   1024 ?        Sl    824:26        \_ /usr/sbin/mysqld --basedir=/usr --
datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --
loror=/var/log/mysql/error.log --open-files-limit=25000 --pid-
file=/var/run/mysqld/mysqld.pid --
socket=/var/run/mysqld/mysqld.socport=3306

root@testserver:~# ps -o etime,time,bsdstart,comm 1024
    ELAPSED     TIME  START COMMAND
 7-00:46:14 13:47:18 Jan 16 mysqld
.........
.........
mysql> show processlist;
+------+------+-----------+-----------------------+---------------+---------+-------------
------
| Id   | User | [xurl=https://supportnet.de/faqsthread/1038|Internet Seiten sperren (Windows hosts)]Host[/url]      | db                       | Command | Time   | State             
| Info      
+------+------+-----------+-----------------------+---------------+---------+-------------
------
| 2872 | root | localhost | Ziel-Datenbank | Query       | 52397 | Sending
data | DELETE FROM `Kartenpunkte1` USING `Kartenpunkte1`,
`Kartenpunkte1  |
| 3169 | root | localhost | NULL           | Query   |     0 | init         | show
processlist


Meine Fragen:

Lebt dieser Prozess/Befehl überhaupt noch?
Kann man auch in der MySQL-Shell einen Prozess in den Hintergrund
verschieben damit ich die Shell schliessen kann?
Wie lange wird dieser Prozess voraussichlich noch laufen?
Ich hatte die Zeit des Testlaufes (2 min 38,80 sec) linear
hochgerechnet, also 716.000/9000*2:38 und  bin auf etwa 3,5 Stunden
gekommen.
Da aber jeder Datensatz mit jedem verglichen werden muss habe ich
die Befürchtung die Rechnung lautet 3[sup]716.000[/sup] oder
716.000[sup]3[/sup] und dann mal Zeit pro vergleich (dann bin ich
jeweils am A....)
Gibt es einen performanteren Befehl?

Deine Antwort

Dein angezeigter Name (optional):
Datenschutz: Deine Email-Adresse benutzen wir ausschließlich, um dir Benachrichtigungen zu schicken. Es gilt unsere Datenschutzerklärung.
Anti-Spam-Captcha:
Bitte logge dich ein oder melde dich neu an, um das Anti-Spam-Captcha zu vermeiden.
...