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?