Datenbank langsam retriving/aktualisieren/einfügen problem mit mehr als 5mil Datensätze in jeder Tabelle

StackOverflow https://stackoverflow.com/questions/1961327

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
War es hilfreich?

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 ein PRIMARY KEY
  • member_extra.id ist ein PRIMARY 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top