Rumah >pangkalan data >tutorial mysql >Apakah proses pelaksanaan sambungan jadual Mysql?

Apakah proses pelaksanaan sambungan jadual Mysql?

PHPz
PHPzke hadapan
2023-06-01 17:26:231475semak imbas

    1. Prakata

    Untuk operasi penyambungan, kami meletakkan syarat perkaitan antara meja pemanduan dan meja pandu selepas dihidupkan jadual dan Jika keadaan penapis jadual didorong diletakkan selepas pada atau di mana, tiada ralat akan dilaporkan, tetapi set hasil yang diperoleh adalah berbeza? ? ?

    1.1 Prinsip sambungan mysql

    Seperti yang kita sedia maklum, mysql adalah berdasarkan algoritma Nested-Loop Join (Nested-Loop Join, tanpa mengira algoritma pengoptimuman) untuk melakukan sambungan operasi antara jadual Proses umum adalah seperti berikut:

    • Pilih jadual pemacu dan gunakan syarat penapis yang berkaitan dengan jadual pemacu untuk melaksanakan pertanyaan jadual tunggal pada jadual pemacu ;

    • Untuk setiap rekod dalam jadual pemandu yang ditanya, cari rekod yang sepadan dalam jadual didorong.

    Kod pseudo adalah seperti berikut:

    for each row in t1 {      // 遍历满足对t1单表查询结果集中的每一条纪录
        for each row in t2 {  // 对于某条t1纪录,遍历满足对t2单表查询结果集中的每一条纪录
            if row satisfies join conditions, send to client
        }
    }

    1.2 arahan tunjukkan amaran

    Pernyataan sql yang kami tulis dioptimumkan oleh pengoptimum Ia kemudiannya akan diserahkan kepada pelaksana untuk pelaksanaan, dan arahan amaran tunjukkan boleh membantu kami mendapatkan SQL yang dioptimumkan oleh pengoptimum.

    2. Penyediaan

    Struktur jadual adalah seperti berikut:

    CREATE TABLE `student` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `stu_code` varchar(20) NOT NULL DEFAULT '',
      `stu_name` varchar(30) NOT NULL DEFAULT '',
      `stu_sex` varchar(10) NOT NULL DEFAULT '',
      `stu_age` int(10) NOT NULL DEFAULT '0',
      `stu_dept` varchar(30) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`) USING BTREE,
      UNIQUE KEY `uq_stu_code` (`stu_code`)
    ) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4
    
    CREATE TABLE `course` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `cou_code` varchar(20) NOT NULL DEFAULT '',
      `cou_name` varchar(50) NOT NULL DEFAULT '',
      `cou_score` int(10) NOT NULL DEFAULT '0',
      `stu_code` varchar(20) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`) USING BTREE,
      KEY `idx_stu_code_cou_code` (`stu_code`,`cou_code`)
    ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4

    Data jadual adalah seperti berikut:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    3 Perbezaan antara on dan where in inner join

    sql adalah seperti berikut:

    rreee

    Laksanakan perintah explain+sql:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    Laksanakan arahan amaran paparan:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    Analisis: Daripada analisis amaran rancangan, 对于inner join连接,经过优化器优化后,on连接条件会转化为where!也就是说内连接中的where和on是等价的.

    4. Perbezaan antara sambung kiri sambung kiri dan di mana

    4.1 di mana keadaan penapis jadual pemandu

    sql adalah seperti berikut:

    select * from student
    inner join course on student.stu_code = course.stu_code
    and student.stu_code >= 3 and course.cou_score >= 80;

    Laksanakan arahan explain+sql:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    Laksanakan arahan amaran tunjukkan:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    Set keputusan:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    Analisis: Dari analisis explain, dapat dilihat bahawa pelajar digunakan sebagai jadual pemacu, dan pelajar stu_code >= 3 digunakan sebagai keadaan penapis untuk melakukan imbasan jadual penuh, dan kemudian student.stu_code (iaitu, dalam keadaan) bagi setiap rekod yang ditanya digunakan sebagai syarat penapis untuk melaksanakan pertanyaan jadual tunggal pada kursus jadual terdorong.

    4.2 pada keadaan penapis jadual pemacu

    sql adalah seperti berikut:

    select * from student
    left join course on student.stu_code = course.stu_code
    where student.stu_code >= 3;

    Laksanakan perintah explain+sql:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    Laksanakan arahan amaran rancangan:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    Set keputusan:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    Daripada set keputusan, student.stu_code >= 3 tidak berkuat kuasa.

    Analisis: Daripada analisis explain, pelajar digunakan sebagai jadual pemacu untuk melakukan imbasan jadual penuh, dan kemudian student.stu_code dan student.stu_code bagi setiap rekod yang ditanya adalah >= 3 (Iaitu, dalam keadaan) digunakan sebagai syarat penapis untuk membolehkan jadual didorong melakukan pertanyaan jadual tunggal; >sql adalah seperti berikut: 此时student.stu_code >= 3对驱动表是不过滤的,仅在连接被驱动表时生效,查询不到符合纪录而返回NULL!

    select * from student
    left join course on student.stu_code = course.stu_code 
    and student.stu_code >= 3;

    Laksanakan arahan explain+sql:

    Laksanakan persembahan arahan amaran:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    Set keputusan:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    Analisis: Daripada analisis explain, pelajar digunakan sebagai jadual pemacu untuk melakukan imbasan jadual penuh, dan kemudian student.stu_code dan course.cou_score bagi setiap rekod pertanyaan ialah >= 80 (yang ialah, ) dalam keadaan digunakan sebagai syarat penapis untuk membolehkan jadual didorong untuk melakukan pertanyaan jadual tunggal; 🎜>

    Laksanakan arahan explain+sql:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    Laksanakan tunjukkan arahan amaran:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    Set keputusan:

    Apakah proses pelaksanaan sambungan jadual Mysql?

    Daripada analisis tunjukkan amaran? Sambungan sambung kiri menjadi sambungan sambung dalam?

    Analisis: Daripada analisis amaran rancangan, jika jadual didorong mempunyai keadaan penapis di mana, maka cantuman kiri akan menjadi tidak sah dan dioptimumkan menjadi sambungan cantuman dalaman. Jadi

    . Apakah proses pelaksanaan sambungan jadual Mysql?

    Atas ialah kandungan terperinci Apakah proses pelaksanaan sambungan jadual Mysql?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam