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

Apakah proses pelaksanaan sambungan jadual Mysql?

PHPz
Lepaskan: 2023-06-01 17:26:23
ke hadapan
1441 orang telah melayarinya

    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
        }
    }
    Salin selepas log masuk

    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
    Salin selepas log masuk

    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;
    Salin selepas log masuk

    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;
    Salin selepas log masuk

    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;
    Salin selepas log masuk

    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!

    Label berkaitan:
    sumber:yisu.com
    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
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan