Rumah pangkalan data tutorial mysql MySQL数据库优化概述三_MySQL

MySQL数据库优化概述三_MySQL

Jun 01, 2016 pm 01:59 PM
Pengoptimuman pangkalan data permukaan

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 的结果如下:

  • Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

    Alat AI Hot

    Undresser.AI Undress

    Undresser.AI Undress

    Apl berkuasa AI untuk mencipta foto bogel yang realistik

    AI Clothes Remover

    AI Clothes Remover

    Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

    Undress AI Tool

    Undress AI Tool

    Gambar buka pakaian secara percuma

    Clothoff.io

    Clothoff.io

    Penyingkiran pakaian AI

    AI Hentai Generator

    AI Hentai Generator

    Menjana ai hentai secara percuma.

    Artikel Panas

    R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
    3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Tetapan grafik terbaik
    3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
    3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

    Alat panas

    Notepad++7.3.1

    Notepad++7.3.1

    Editor kod yang mudah digunakan dan percuma

    SublimeText3 versi Cina

    SublimeText3 versi Cina

    Versi Cina, sangat mudah digunakan

    Hantar Studio 13.0.1

    Hantar Studio 13.0.1

    Persekitaran pembangunan bersepadu PHP yang berkuasa

    Dreamweaver CS6

    Dreamweaver CS6

    Alat pembangunan web visual

    SublimeText3 versi Mac

    SublimeText3 versi Mac

    Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

    Bagaimanakah Hibernate mengoptimumkan prestasi pertanyaan pangkalan data? Bagaimanakah Hibernate mengoptimumkan prestasi pertanyaan pangkalan data? Apr 17, 2024 pm 03:00 PM

    Petua untuk mengoptimumkan prestasi pertanyaan Hibernate termasuk: menggunakan pemuatan malas untuk menangguhkan pemuatan koleksi dan objek yang berkaitan untuk menggabungkan operasi kemas kini, memadam atau memasukkan menggunakan cache peringkat kedua untuk menyimpan objek yang sering ditanya dalam ingatan; , dapatkan semula entiti dan entiti yang berkaitan dengannya untuk mengelakkan mod pertanyaan SELECTN+1 untuk mendapatkan data besar dalam blok untuk meningkatkan prestasi pertanyaan tertentu;

    Bagaimana untuk meningkatkan kelajuan akses laman web Python melalui pengoptimuman pangkalan data? Bagaimana untuk meningkatkan kelajuan akses laman web Python melalui pengoptimuman pangkalan data? Aug 07, 2023 am 11:29 AM

    Bagaimana untuk meningkatkan kelajuan akses laman web Python melalui pengoptimuman pangkalan data? Ringkasan Semasa membina tapak web Python, pangkalan data adalah komponen kritikal. Jika kelajuan capaian pangkalan data adalah perlahan, ia akan menjejaskan prestasi dan pengalaman pengguna tapak web secara langsung. Artikel ini akan membincangkan beberapa cara untuk mengoptimumkan pangkalan data anda untuk meningkatkan kelajuan akses tapak web Python anda, bersama-sama dengan beberapa kod sampel. Pengenalan Bagi kebanyakan laman web Python, pangkalan data adalah bahagian penting dalam menyimpan dan mendapatkan semula data. Jika tidak dioptimumkan, pangkalan data boleh menjadi hambatan prestasi. Buku

    Petua pengoptimuman prestasi Spring Boot: cipta aplikasi sepantas angin Petua pengoptimuman prestasi Spring Boot: cipta aplikasi sepantas angin Feb 25, 2024 pm 01:01 PM

    SpringBoot ialah rangka kerja Java popular yang terkenal dengan kemudahan penggunaan dan pembangunan pesatnya. Walau bagaimanapun, apabila kerumitan aplikasi meningkat, isu prestasi boleh menjadi halangan. Untuk membantu anda mencipta aplikasi springBoot sepantas angin, artikel ini akan berkongsi beberapa petua pengoptimuman prestasi praktikal. Optimumkan masa permulaan Masa permulaan aplikasi adalah salah satu faktor utama pengalaman pengguna. SpringBoot menyediakan beberapa cara untuk mengoptimumkan masa permulaan, seperti menggunakan caching, mengurangkan output log dan mengoptimumkan pengimbasan laluan kelas. Anda boleh melakukan ini dengan menetapkan spring.main.lazy-initialization dalam fail application.properties

    Bagaimana untuk meningkatkan prestasi MySQL dengan menggunakan indeks komposit Bagaimana untuk meningkatkan prestasi MySQL dengan menggunakan indeks komposit May 11, 2023 am 11:10 AM

    Dalam pangkalan data MySQL, pengindeksan adalah cara yang sangat penting untuk pengoptimuman prestasi. Apabila jumlah data dalam jadual meningkat, indeks yang tidak sesuai boleh menyebabkan pertanyaan menjadi perlahan atau malah menyebabkan ranap pangkalan data. Untuk meningkatkan prestasi pangkalan data, indeks perlu digunakan secara rasional apabila mereka bentuk struktur jadual dan pernyataan pertanyaan. Indeks komposit ialah teknologi pengindeksan yang lebih maju yang meningkatkan kecekapan pertanyaan dengan menggabungkan berbilang medan sebagai indeks. Dalam artikel ini, kami akan memperincikan cara meningkatkan prestasi MySQL dengan menggunakan indeks komposit. Apakah komposit indeks komposit

    Java Spring Boot Keselamatan pengoptimuman prestasi: membuat sistem anda terbang Java Spring Boot Keselamatan pengoptimuman prestasi: membuat sistem anda terbang Feb 19, 2024 pm 05:27 PM

    1. Pengoptimuman kod untuk mengelakkan penggunaan terlalu banyak anotasi keselamatan: Dalam Pengawal dan Perkhidmatan, cuba kurangkan penggunaan @PreAuthorize dan @PostAuthorize dan anotasi lain ini akan meningkatkan masa pelaksanaan kod. Optimumkan pernyataan pertanyaan: Apabila menggunakan springDataJPA, mengoptimumkan pernyataan pertanyaan boleh mengurangkan masa pertanyaan pangkalan data, dengan itu meningkatkan prestasi sistem. Caching maklumat keselamatan: Caching beberapa maklumat keselamatan yang biasa digunakan boleh mengurangkan bilangan capaian pangkalan data dan meningkatkan kelajuan tindak balas sistem. 2. Gunakan indeks untuk pengoptimuman pangkalan data: Mencipta indeks pada jadual yang sering ditanya boleh meningkatkan kelajuan pertanyaan pangkalan data dengan ketara. Bersihkan log dan meja sementara dengan kerap: Bersihkan log dan meja sementara dengan kerap

    Dari perspektif teknikal, mengapa Oracle boleh mengalahkan MySQL? Dari perspektif teknikal, mengapa Oracle boleh mengalahkan MySQL? Sep 08, 2023 pm 04:15 PM

    Dari perspektif teknikal, mengapa Oracle boleh mengalahkan MySQL? Dalam beberapa tahun kebelakangan ini, sistem pengurusan pangkalan data (DBMS) telah memainkan peranan penting dalam penyimpanan dan pemprosesan data. Oracle dan MySQL, dua DBMS yang popular, sentiasa menarik perhatian ramai. Walau bagaimanapun, dari perspektif teknikal, Oracle lebih berkuasa daripada MySQL dalam beberapa aspek, jadi Oracle mampu mengalahkan MySQL. Pertama, Oracle cemerlang dalam mengendalikan data berskala besar. Oracl

    Bagaimana untuk melaksanakan pernyataan untuk melihat data jadual dalam MySQL? Bagaimana untuk melaksanakan pernyataan untuk melihat data jadual dalam MySQL? Nov 08, 2023 pm 01:40 PM

    Tajuk: Pernyataan dan contoh kod khusus untuk melihat data jadual dalam MySQL MySQL ialah sistem pengurusan pangkalan data hubungan sumber terbuka yang digunakan secara meluas dalam aplikasi semua saiz. Dalam MySQL, melihat data jadual adalah operasi yang sangat asas Berikut akan memperkenalkan cara melaksanakan operasi ini melalui pernyataan dan contoh kod tertentu. Pertama, kami akan memperkenalkan pernyataan dan contoh kod khusus untuk melihat data jadual melalui alat baris arahan MySQL. Katakan kita mempunyai jadual bernama "pekerja", berikut ialah pas

    Masalah pangkalan data biasa dalam sistem Linux dan penyelesaiannya Masalah pangkalan data biasa dalam sistem Linux dan penyelesaiannya Jun 18, 2023 pm 03:36 PM

    Dengan perkembangan berterusan teknologi komputer dan pertumbuhan berterusan skala data, pangkalan data telah menjadi teknologi penting. Walau bagaimanapun, terdapat beberapa masalah biasa yang dihadapi apabila menggunakan pangkalan data dalam sistem Linux Artikel ini akan memperkenalkan beberapa masalah pangkalan data biasa dalam sistem Linux dan penyelesaiannya. Masalah sambungan pangkalan data Apabila menggunakan pangkalan data, masalah seperti kegagalan sambungan atau tamat masa sambungan kadangkala berlaku Masalah ini mungkin disebabkan oleh ralat konfigurasi pangkalan data atau hak akses yang tidak mencukupi. Penyelesaian: Semak fail konfigurasi pangkalan data untuk memastikan

    See all articles