Datenbank langsam retriving/aktualisieren/einfügen problem mit mehr als 5mil Datensätze in jeder Tabelle
-
21-09-2019 - |
Frage
Wie die Struktur der Datenbank zu vermeiden, Verlangsamungen?(Motor:MyISAM)
Derzeit habe ich die Datenbank mit mehr als 5milion Datensätze in einer Tabelle, die Ursachen slow Daten abrufen.Ich bin derzeit auf der Suche nach Möglichkeiten, um Struktur-Datenbank zu vermeiden, diese Arten von Datenbank.(Datenbank-Engine MyISAM)
Tabellen, die Probleme verursachen, werden Beiträge und Kommentare mit mehr als 5mil Datensätze in jeder.
Ich hatte eine Idee, die bei der Verwendung von text-Datei als Speicher beim speichern von Aufzeichnungen nach Datum, so dass jede Datei enthaltenen genug Daten, dass war nicht zu Bremsen abrufen und speichern von Prozessen, Aber mit Datenbanken ich weiß nicht, was zu tun ist :(
Gibt es eine Möglichkeit, Daten zu speichern (ca 5mil-Einträge in jeder) in der MySQL-Datenbank nicht zu langsam abrufen, einfügen oder aktualisieren von Daten?
"posts" - Struktur
CREATE TABLE IF NOT EXISTS `ibf_posts` (
`pid` int(10) NOT NULL auto_increment,
`append_edit` tinyint(1) default '0',
`edit_time` int(10) default NULL,
`author_id` mediumint(8) NOT NULL default '0',
`author_name` varchar(32) default NULL,
`use_sig` tinyint(1) NOT NULL default '0',
`use_emo` tinyint(1) NOT NULL default '0',
`ip_address` varchar(16) default NULL,
`post_date` int(10) default NULL,
`icon_id` smallint(3) default NULL,
`post` text,
`queued` tinyint(1) NOT NULL default '0',
`topic_id` int(10) NOT NULL default '0',
`post_title` varchar(255) default NULL,
`new_topic` tinyint(1) default '0',
`edit_name` varchar(255) default NULL,
`post_key` varchar(32) default NULL,
`post_parent` int(10) NOT NULL default '0',
`post_htmlstate` smallint(1) NOT NULL default '0',
`post_edit_reason` varchar(255) default NULL,
PRIMARY KEY (`pid`),
KEY `topic_id` (`topic_id`,`queued`,`pid`,`post_date`),
KEY `author_id` (`author_id`,`topic_id`),
KEY `post_date` (`post_date`),
KEY `ip_address` (`ip_address`),
KEY `post_key` (`post_key`),
FULLTEXT KEY `post` (`post`),
FULLTEXT KEY `post_2` (`post`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Abfrage:
SELECT p.*, pp.*,.id,m.name,m.mgroup,m.email,m.joined,m.posts, m.last_visit, m.last_activity,m.login_anonymous,m.title,m.hide_email, m.warn_level, m.warn_lastwarn, m.points, m.topics_started, m.skin,
me.msnname,me.aim_name,me.icq_number,me.signature, me.website,me.yahoo,me.location, me.avatar_location, me.avatar_type, me.avatar_size, m.members_display_name, m.custom_post_css, m.custom_right_img
m.custom_post_color
FROM posts p
LEFT JOIN members m ON (m.id=p.author_id)
LEFT JOIN profile_portal pp ON (m.id=pp.pp_member_id)
LEFT JOIN member_extra me ON (me.id=m.id)
WHERE p.pid IN(--post ids here)
ORDER BY --ordering here
Lösung
5M
nicht viel.
Wahrscheinlich haben Sie indiziert die Tabelle falsch.
Bitte posten Sie Ihre Abfrage, und wir werden wahrscheinlich sagen, wie es zu verbessern.
Update:
SELECT p.*, pp.*,.id,m.name,m.mgroup,m.email,m.joined,m.posts, m.last_visit, m.last_activity,m.login_anonymous,m.title,m.hide_email, m.warn_level, m.warn_lastwarn, m.points, m.topics_started, m.skin,
me.msnname,me.aim_name,me.icq_number,me.signature, me.website,me.yahoo,me.location, me.avatar_location, me.avatar_type, me.avatar_size, m.members_display_name, m.custom_post_css, m.custom_right_img
m.custom_post_color
FROM posts p
LEFT JOIN
members m
ON m.id = p.author_id
LEFT JOIN
profile_portal pp
ON pp.pp_member_id = m.id
LEFT JOIN
member_extra me
ON me.id = m.id
WHERE p.pid IN (--post ids here)
ORDER BY
--ordering here
Stellen Sie sicher, dass:
members.id
ist einPRIMARY KEY
member_extra.id
ist einPRIMARY KEY
- Sie haben einen index auf
profile_portal.pp_member_id
Auch Sie verzichtet ORDER BY
Klausel diese Klausel ist allerdings auch wichtig, mit Indizes können verbessern Sie als gut.
Andere Tipps
ERKLÄREN Sie PLAN wird Ihnen sagen, wie Sie die Abfrage-engine ist, es zu tun.Wenn Sie unter "Tabelle suchen", wissen Sie, Sie brauchen Indizes.
5M Zeilen in einer Tabelle ist nicht so viel, wie lange werden Ihre Anfragen nehmen?Ich vermute, Sie haben einige Probleme mit der Indizierung. ERKLÄREN Anweisung kann helfen, zu finden heraus, was Sie Abfragen tatsächlich tun.
Wenn Sie richtig indizierten Tabellen und vernünftig fragt, kann man sich in Partitionierung..
Edit:
Sie könnten versuchen, wenn das hinzufügen von-INDEX(pid, author_id) oder INDEX(author_id, pid) auf dem Tisch ibf_posts hilft.