Heim Datenbank MySQL-Tutorial MySQL数据库优化概述三_MySQL

MySQL数据库优化概述三_MySQL

Jun 01, 2016 pm 01:59 PM
数据库优化

Using where

  WHERE 子句将用来限制哪些记录匹配了下一个表或者发送给客户端。除非你特别地想要取得或者检查表种的所有记录,否则的话当查询的 Extra 字段值不是 Using where 并且表连接类型是 ALL 或 index 时可能表示有问题。

  如果你想要让查询尽可能的快,那么就应该注意 Extra 字段的值为Using filesort 和 Using temporary 的情况。

  你可以通过 EXPLAIN 的结果中 rows 字段的值的乘积大概地知道本次连接表现如何。它可以粗略地告诉我们MySQL在查询过程中会查询多少条记录。如果是使用系统变量 max_join_size 来取得查询结果,这个乘积还可以用来确定会执行哪些多表 SELECT 语句。详情请看"7.5.2 Tuning Server Parameters"。

  下面的例子展示了如何通过 EXPLAIN 提供的信息来较大程度地优化多表联合查询的性能。

  假设有下面的 SELECT 语句,正打算用 EXPLAIN 来检测:


EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,
            tt.ProjectReference, tt.EstimatedShipDate,
            tt.ActualShipDate, tt.ClientID,
            tt.ServiceCodes, tt.RepetitiveID,
            tt.CurrentProcess, tt.CurrentDPPerson,
            tt.RecordVolume, tt.DPPrinted, et.COUNTRY,
            et_1.COUNTRY, do.CUSTNAME
        FROM tt, et, et AS et_1, do
        WHERE tt.SubmitTime IS NULL
            AND tt.ActualPC = et.EMPLOYID
            AND tt.AssignedPC = et_1.EMPLOYID
            AND tt.ClientID = do.CUSTNMBR;
 


  在这个例子中,先做以下假设:

  • 要比较的字段定义如下:
    Table Column Column Type
    tt ActualPC CHAR(10)
    tt AssignedPC CHAR(10)
    tt ClientID CHAR(10)
    et EMPLOYID CHAR(15)
    do CUSTNMBR CHAR(15)

  • 数据表的索引如下:
    Table Index
    tt ActualPC
    tt AssignedPC
    tt ClientID
    et EMPLOYID (primary key)
    do CUSTNMBR (primary key)

  • tt.ActualPC 的值是不均匀分布的。

      在任何优化措施未采取之前,经过 EXPLAIN 分析的结果显示如下:

    table type possible_keys key  key_len ref  rows  Extra
    et    ALL  PRIMARY       NULL NULL    NULL 74
    do    ALL  PRIMARY       NULL NULL    NULL 2135
    et_1  ALL  PRIMARY       NULL NULL    NULL 74
    tt    ALL  AssignedPC,   NULL NULL    NULL 3872
               ClientID,
               ActualPC
          range checked for each record (key map: 35)

      由于字段 type 的对于每个表值都是 ALL,这个结果意味着MySQL对所有的表做一个迪卡尔积;这就是说,每条记录的组合。这将需要花很长的时间,因为需要扫描每个表总记录数乘积的总和。在这情况下,它的积是 74 * 2135 * 74 * 3872 = 45,268,558,720 条记录。如果数据表更大的话,你可以想象一下需要多长的时间。

      在这里有个问题是当字段定义一样的时候,MySQL就可以在这些字段上更快的是用索引(对 ISAM 类型的表来说,除非字段定义完全一样,否则不会使用索引)。在这个前提下,VARCHAR 和 CHAR是一样的除非它们定义的长度不一致。由于 tt.ActualPC 定义为 CHAR(10),et.EMPLOYID 定义为 CHAR(15),二者长度不一致。

      为了解决这个问题,需要用 ALTER TABLE 来加大 ActualPC 的长度从10到15个字符

    mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);

      现在 tt.ActualPC 和 et.EMPLOYID 都是 VARCHAR(15)

      了。再来执行一次 EXPLAIN 语句看看结果:


    table type   possible_keys key     key_len ref         rows    Extra
    tt    ALL    AssignedPC,   NULL    NULL    NULL        3872    Using
                 ClientID,                                         where
                 ActualPC
    do    ALL    PRIMARY       NULL    NULL    NULL        2135
          range checked for each record (key map: 1)
    et_1  ALL    PRIMARY       NULL    NULL    NULL        74
          range checked for each record (key map: 1)
    et    eq_ref PRIMARY       PRIMARY 15      tt.ActualPC 1

      这还不够,它还可以做的更好:现在 rows 值乘积已经少了74倍。这次查询需要用2秒钟。

      第二个改变是消除在比较 tt.AssignedPC = et_1.EMPLOYID 和 tt.ClientID = do.CUSTNMBR 中字段的长度不一致问题:

    mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),
        ->                MODIFY ClientID   VARCHAR(15);

      现在 EXPLAIN 的结果如下:


    table type   possible_keys key      key_len ref           rows Extra
    et    ALL    PRIMARY       NULL     NULL    NULL          74
    tt    ref    AssignedPC,   ActualPC 15      et.EMPLOYID   52   Using
                 ClientID,                                         where
                 ActualPC
    et_1  eq_ref PRIMARY       PRIMARY  15      tt.AssignedPC 1
    do    eq_ref PRIMARY       PRIMARY  15      tt.ClientID   1

      这看起来已经是能做的最好的结果了。

      遗留下来的问题是,MySQL默认地认为字段tt.ActualPC 的值是均匀分布的,然而表 tt 并非如此。幸好,我们可以很方便的让MySQL分析索引的分布:  


    mysql> ANALYZE TABLE tt;

      到此为止,表连接已经优化的很完美了,EXPLAIN 的结果如下:

  • Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Beste grafische Einstellungen
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    Wie optimiert Hibernate die Leistung von Datenbankabfragen? Wie optimiert Hibernate die Leistung von Datenbankabfragen? Apr 17, 2024 pm 03:00 PM

    Zu den Tipps zur Optimierung der Hibernate-Abfrageleistung gehören: Verwenden von Lazy Loading, um das Laden von Sammlungen und zugehörigen Objekten zu verzögern; Verwenden von Stapelverarbeitungsvorgängen, um Aktualisierungs-, Lösch- oder Einfügevorgänge zu kombinieren, um häufig abgefragte Objekte im Speicher zu speichern; , Entitäten und ihre zugehörigen Entitäten abrufen; Abfrageparameter optimieren, um den SELECTN+1-Abfragemodus zu vermeiden; Verwendung von Indizes, um die Leistung bestimmter Abfragen zu verbessern;

    Wie kann die Zugriffsgeschwindigkeit der Python-Website durch Datenbankoptimierung verbessert werden? Wie kann die Zugriffsgeschwindigkeit der Python-Website durch Datenbankoptimierung verbessert werden? Aug 07, 2023 am 11:29 AM

    Wie kann die Zugriffsgeschwindigkeit der Python-Website durch Datenbankoptimierung verbessert werden? Zusammenfassung Beim Erstellen einer Python-Website ist eine Datenbank eine wichtige Komponente. Wenn die Datenbankzugriffsgeschwindigkeit langsam ist, wirkt sich dies direkt auf die Leistung und das Benutzererlebnis der Website aus. In diesem Artikel werden einige Möglichkeiten zur Optimierung Ihrer Datenbank erläutert, um die Zugriffsgeschwindigkeit Ihrer Python-Website zu verbessern, sowie einige Beispielcodes. Einführung Für die meisten Python-Websites ist die Datenbank ein wichtiger Bestandteil beim Speichern und Abrufen von Daten. Wenn die Datenbank nicht optimiert wird, kann sie zu einem Leistungsengpass werden. Buch

    Tipps zur Leistungsoptimierung von Spring Boot: Erstellen Sie Anwendungen so schnell wie der Wind Tipps zur Leistungsoptimierung von Spring Boot: Erstellen Sie Anwendungen so schnell wie der Wind Feb 25, 2024 pm 01:01 PM

    SpringBoot ist ein beliebtes Java-Framework, das für seine Benutzerfreundlichkeit und schnelle Entwicklung bekannt ist. Mit zunehmender Komplexität der Anwendung können jedoch Leistungsprobleme zu einem Engpass werden. Um Ihnen dabei zu helfen, schnellstmöglich eine SpringBoot-Anwendung zu erstellen, finden Sie in diesem Artikel einige praktische Tipps zur Leistungsoptimierung. Optimieren Sie die Startzeit. Die Startzeit einer Anwendung ist einer der Schlüsselfaktoren für die Benutzererfahrung. SpringBoot bietet verschiedene Möglichkeiten zur Optimierung der Startzeit, z. B. die Verwendung von Caching, die Reduzierung der Protokollausgabe und die Optimierung des Klassenpfad-Scans. Sie können dies tun, indem Sie spring.main.lazy-initialization in der Datei application.properties festlegen

    So verbessern Sie die MySQL-Leistung durch die Verwendung zusammengesetzter Indizes So verbessern Sie die MySQL-Leistung durch die Verwendung zusammengesetzter Indizes May 11, 2023 am 11:10 AM

    In der MySQL-Datenbank ist die Indizierung ein sehr wichtiges Mittel zur Leistungsoptimierung. Wenn die Datenmenge in der Tabelle zunimmt, können ungeeignete Indizes dazu führen, dass Abfragen langsamer werden oder sogar Datenbankabstürze verursachen. Um die Datenbankleistung zu verbessern, müssen Indizes beim Entwurf von Tabellenstrukturen und Abfrageanweisungen rational verwendet werden. Der zusammengesetzte Index ist eine fortschrittlichere Indizierungstechnologie, die die Abfrageeffizienz durch die Kombination mehrerer Felder als Indizes verbessert. In diesem Artikel erfahren Sie im Detail, wie Sie die MySQL-Leistung mithilfe zusammengesetzter Indizes verbessern können. Was ist ein zusammengesetzter Index?

    Leistungsoptimierung von Java Spring Boot Security: Bringen Sie Ihr System zum Fliegen Leistungsoptimierung von Java Spring Boot Security: Bringen Sie Ihr System zum Fliegen Feb 19, 2024 pm 05:27 PM

    1. Codeoptimierung, um die Verwendung zu vieler Sicherheitsanmerkungen zu vermeiden: Versuchen Sie in Controller und Service, die Verwendung von @PreAuthorize und @PostAuthorize sowie anderen Anmerkungen zu reduzieren, um die Ausführungszeit des Codes zu verlängern. Abfrageanweisungen optimieren: Bei Verwendung von springDataJPA kann die Optimierung von Abfrageanweisungen die Datenbankabfragezeit verkürzen und dadurch die Systemleistung verbessern. Sicherheitsinformationen zwischenspeichern: Durch das Zwischenspeichern einiger häufig verwendeter Sicherheitsinformationen kann die Anzahl der Datenbankzugriffe verringert und die Reaktionsgeschwindigkeit des Systems verbessert werden. 2. Verwenden Sie Indizes zur Datenbankoptimierung: Durch das Erstellen von Indizes für häufig abgefragte Tabellen kann die Abfragegeschwindigkeit der Datenbank erheblich verbessert werden. Protokolle und temporäre Tabellen regelmäßig bereinigen: Protokolle und temporäre Tabellen regelmäßig bereinigen

    Warum kann Oracle aus technischer Sicht MySQL schlagen? Warum kann Oracle aus technischer Sicht MySQL schlagen? Sep 08, 2023 pm 04:15 PM

    Warum kann Oracle aus technischer Sicht MySQL schlagen? In den letzten Jahren haben Datenbankmanagementsysteme (DBMS) eine wichtige Rolle bei der Datenspeicherung und -verarbeitung gespielt. Oracle und MySQL, zwei beliebte DBMS, haben schon immer große Aufmerksamkeit erregt. Aus technischer Sicht ist Oracle jedoch in einigen Aspekten leistungsfähiger als MySQL, sodass Oracle MySQL besiegen kann. Erstens zeichnet sich Oracle durch den Umgang mit großen Datenmengen aus. Orakel

    Wie implementiert man die Anweisung zum Anzeigen von Tabellendaten in MySQL? Wie implementiert man die Anweisung zum Anzeigen von Tabellendaten in MySQL? Nov 08, 2023 pm 01:40 PM

    Titel: Anweisungen und spezifische Codebeispiele zum Anzeigen von Tabellendaten in MySQL MySQL ist ein relationales Open-Source-Datenbankverwaltungssystem, das in Anwendungen aller Größen weit verbreitet ist. In MySQL ist das Anzeigen von Tabellendaten eine sehr grundlegende Operation. Im Folgenden wird anhand spezifischer Anweisungen und Codebeispiele erläutert, wie diese Operation implementiert wird. Zunächst stellen wir die Anweisungen und spezifischen Codebeispiele zum Anzeigen von Tabellendaten über das MySQL-Befehlszeilentool vor. Angenommen, wir haben eine Tabelle mit dem Namen „Mitarbeiter“, das Folgende ist der Pass

    Häufige Datenbankprobleme in Linux-Systemen und ihre Lösungen Häufige Datenbankprobleme in Linux-Systemen und ihre Lösungen Jun 18, 2023 pm 03:36 PM

    Mit der kontinuierlichen Weiterentwicklung der Computertechnologie und dem kontinuierlichen Wachstum des Datenumfangs sind Datenbanken zu einer lebenswichtigen Technologie geworden. Bei der Verwendung von Datenbanken in Linux-Systemen treten jedoch einige häufige Probleme auf. In diesem Artikel werden einige häufige Datenbankprobleme in Linux-Systemen und deren Lösungen vorgestellt. Probleme mit der Datenbankverbindung Bei der Verwendung einer Datenbank treten manchmal Probleme wie Verbindungsfehler oder Verbindungstimeouts auf. Diese Probleme können durch Datenbankkonfigurationsfehler oder unzureichende Zugriffsrechte verursacht werden. Lösung: Überprüfen Sie zur Sicherheit die Datenbankkonfigurationsdatei

    See all articles