MySql Tabelle aktualisieren

Sempervivum

Erfahrenes Mitglied
Wenn ich die Anzahl in einer anderen Tabelle speichern würde, müsste er auch durch 500.000 Datensätze
Für das Ermitteln der Anzahl ja aber für das Eintragen in der Tabelle mit den Alben nur durch, sagen wir 20.000 bis 50.000
Ich habe da mal Testdaten gebaut mit 1000 Songs und 50 Alben.
Für das Eintragen in abc_mp3_songs wie in diesem Thread angegeben braucht PHP und MySQL 20 ms.
Für das Eintragen in die Tabelle mit den Alben 2,5 ms, also schon ein nennenswerter Unterschied.
SQL bei letzterem:
Code:
UPDATE albums a
SET nr_songs=(
    SELECT COUNT(1)
    FROM abc_mp3_songs s
    WHERE a.id = s.album_id
    )
 

Thomas_Jung

Erfahrenes Mitglied
@Sempervivum
Da gebe ich dir völlig recht.
Bei 500.000 Datensätzen wäre es vielleicht eine Möglichkeit, die Abfrage mit einer Schleife zu realisieren.
In 5.000 Schritten so das MySQL keinen Timeout mehr bekommt. :unsure:
 

Sempervivum

Erfahrenes Mitglied
@Thomas_Jung Meine Version mit einer zusätzlichen Tabelle für die Alben ist immerhin um den Faktor 10 schneller wenn ein Index auf album_id in der Tabelle mit den Songs ist. Nehme ich den heraus sogar um den Faktor 20. Versuche doch einfach mal ob Du damit durch deine 500.000 Datensätze durch kommst.
 

Thomas_Jung

Erfahrenes Mitglied
@Sempervivum

Du hast recht

Habe einen INDEX über das Feld album_id in der Tabelle abc_mp3_songs gelegt

Die Abfrage war

PHP:
UPDATE abc_mp3_albums a

SET `anzahl_mp3`=(

    SELECT COUNT(1)

    FROM abc_mp3_songs s

    WHERE a.album_id = s.album_id

    )


48056 Datensätze betroffen. (Die Abfrage dauerte 0,5902 Sekunden.)(y)

Entferne ich den INDEX in der Tabelle abc_mp3_songs wieder passiert nichts (n)
Vielleicht benutze ich doch mehrere Tabellen :unsure:

abc_mp3_songs
abc_mp3_artist
abc_mp3_album
abc_mp3_genre
abc_mp3_year
 

Zvoni

Erfahrenes Mitglied
Womit wir wieder bei meinem "ursprünglichen" Aufbau landen ;)
btw: Lass Year weg. Das Jahr ist ein Integer. Eine eigene Tabelle bringt dir da nicht viel ausser zusätzlicher Komplexität.
Würde wie folgt vorgehen:
songs hat Fremdschlüssel auf Artist, Album und Genre
album hat Fremdschlüssel auf Artist
So kannst du songs einem Artist zuweisen, welche kein Album haben (Beispiel die Weihnachtssingle, welche auf keinem Album ist).
Was du damit aber nicht abbilden kannst sind Sampler. Dazu brauchst du eine "m:n"-Tabelle
 

Thomas_Jung

Erfahrenes Mitglied
Da waren sie wieder meine Probleme. :eek:
Habe bis jetzt immer nur jeweils 1 Tabelle benötigt.
Also nichts mit LEFT JOIN m:n Fremdschlüssel usw.
Muss also erstmal wieder Google ein paar Antworten entlocken :LOL:
 

Zvoni

Erfahrenes Mitglied
Oh je, jetzt ist mir eine zusätzliche Komplexität eingefallen *ggg*
Was machste mit Songs, welche auf mehreren Alben vorkommen (Song ist auf einem "normalen" Studio-Album, aber auch 3 Jahre später auf einem Best Of, zusätzlich erschwerend ist der Song nochmal 2 Jahre später auf einem Sampler)
aua aua aua
:ROFLMAO::ROFLMAO::ROFLMAO::ROFLMAO::ROFLMAO::ROFLMAO::ROFLMAO:
 

Thomas_Jung

Erfahrenes Mitglied
Ich verwende getid3 zum Import in die Tabelle, das klappt auch super.
Zu:
Was machste mit Songs, welche auf mehreren Alben vorkommen (Song ist auf einem "normalen" Studio-Album.
Bin noch am Überlegen :unsure:

Wollte aus Spaß mal eine MP3-Verwaltung bauen