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? ? ?
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 } }
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.
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:
sql adalah seperti berikut:
rreeeLaksanakan perintah explain+sql:
Laksanakan arahan amaran paparan:
Analisis: Daripada analisis amaran rancangan, 对于inner join连接,经过优化器优化后,on连接条件会转化为where!也就是说内连接中的where和on是等价的
.
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:
Laksanakan arahan amaran tunjukkan:
Set keputusan:
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.
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:
Laksanakan arahan amaran rancangan:
Set keputusan:
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 persembahan arahan amaran:
Set keputusan:
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:
Laksanakan tunjukkan arahan amaran:
Set keputusan:
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.
Atas ialah kandungan terperinci Apakah proses pelaksanaan sambungan jadual Mysql?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!