Maison base de données tutoriel mysql MySQ常量传递辨析

MySQ常量传递辨析

Jun 07, 2016 pm 04:43 PM
oracle 数据库

一 MySQL对于表达式的化简技术,支持常量传递这一技术,如下例:CREATE TABLE `t1` (`id1` int(11) NOT NULL DEFAULT

一 MySQL对于表达式的化简技术,支持常量传递这一技术,如下例:
CREATE TABLE `t1` (
`id1` int(11) NOT NULL DEFAULT '0',
`a1` int(11) DEFAULT NULL,
`b1` int(11) DEFAULT NULL,
PRIMARY KEY (`id1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `t5` (
`id5` int(11) DEFAULT NULL,
`a5` int(11) DEFAULT NULL,
`b5` int(11) DEFAULT NULL,
UNIQUE KEY `id5` (`id5`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

两表各插入一些数据.

对于条件”a1=a5 and a5=1”,被MySQL的优化器优化后,变为”(`xx`.`t5`.`a5` = 1) and (`xx`.`t1`.`a1` = 1)”, 这就是常量传递技术.

mysql> explain extended select * from t5, t1 where a1=a5 and a5=1;
+----+-------------+-------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
| 1 | SIMPLE | t5 | ALL | NULL | NULL | NULL | NULL | 10 | 100.00 | Using where |
| 1 | SIMPLE | t1 | ALL | NULL | NULL | NULL | NULL | 9999 | 100.00 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)

mysql> show warnings;
/* select#1 */ select `xx`.`t5`.`id5` AS `id5`,`xx`.`t5`.`a5` AS `a5`,
`xx`.`t5`.`b5` AS `b5`,`xx`.`t1`.`id1` AS `id1`,`xx`.`t1`.`a1`AS `a1`,`xx`.`t1`.`b1` AS `b1`
from `xx`.`t5` join `xx`.`t1`
where ((`xx`.`t5`.`a5` = 1) and (`xx`.`t1`.`a1` = 1))

 

二 当条件表达式中存在主键的时候,情况会有些不同,如:
mysql> explain extended select * from t5, t1 where id1=id5 and id5=1;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------+
| 1 | SIMPLE | t5 | const | id5 | id5 | 5 | const | 1 | 100.00 | NULL |
| 1 | SIMPLE | t1 | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------+
2 rows in set, 1 warning (0.00 sec)

mysql> show warnings;
/* select#1 */ select '1' AS `id5`,'1' AS `a5`,NULL AS `b5`,
'1' AS `id1`,'1' AS `a1`,NULL AS `b1`
from `xx`.`t5` join `xx`.`t1`
where 1

为什么会这样?
这是因为:
1 常量传递技术,使得MySQL的优化器认为”id1=id5 =1”
2 而id1和id5分别都是主键,所以t1和t5表,都被认为是”常量表”,所以执行计划中type的值是const. 也就是说,t1和t5表元组完全能够确定(即能够在优化阶段被直接读出而不用在执行阶段定位查找元组). 所以t1和t5表的连接操作就很简单了.
3 到了显示执行计划的阶段,这时就不难理解为什么成为了”where 1”. 因为元组已经找到,此时条件已经不在起作用. 结果为真的条件正好满足常量表的元组输出.

所以,如下的一个主键和一个非主键间发生常量传递的情况也就容易理解了.
mysql> explain extended select * from t5, t1 where id1=a5 and a5=1;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | t1 | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL |
| 1 | SIMPLE | t5 | ALL | NULL | NULL | NULL | NULL | 10 | 100.00 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)

mysql> show warnings;
/* select#1 */ select `xx`.`t5`.`id5` AS `id5`,`xx`.`t5`.`a5` AS `a5`,
`xx`.`t5`.`b5` AS `b5`,'1' AS `id1`,'1' AS `a1`,NULL AS `b1`
from `xx`.`t5` join `xx`.`t1`
where (`xx`.`t5`.`a5` = 1)

--------------------------------------分割线 --------------------------------------

Ubuntu 14.04下安装MySQL

《MySQL权威指南(原书第2版)》清晰中文扫描版 PDF

Ubuntu 14.04 LTS 安装 LNMP Nginx\PHP5 (PHP-FPM)\MySQL

Ubuntu 14.04下搭建MySQL主从服务器

Ubuntu 12.04 LTS 构建高可用分布式 MySQL 集群

Ubuntu 12.04下源代码安装MySQL5.6以及Python-MySQLdb

MySQL-5.5.38通用二进制安装

--------------------------------------分割线 --------------------------------------

本文永久更新链接地址:

linux

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Combien de temps les journaux de la base de données Oracle seront-ils conservés ? Combien de temps les journaux de la base de données Oracle seront-ils conservés ? May 10, 2024 am 03:27 AM

Combien de temps les journaux de la base de données Oracle seront-ils conservés ?

Exigences de configuration matérielle du serveur de base de données Oracle Exigences de configuration matérielle du serveur de base de données Oracle May 10, 2024 am 04:00 AM

Exigences de configuration matérielle du serveur de base de données Oracle

De quelle quantité de mémoire Oracle a-t-il besoin ? De quelle quantité de mémoire Oracle a-t-il besoin ? May 10, 2024 am 04:12 AM

De quelle quantité de mémoire Oracle a-t-il besoin ?

Quelle quantité de mémoire est nécessaire pour utiliser la base de données Oracle Quelle quantité de mémoire est nécessaire pour utiliser la base de données Oracle May 10, 2024 am 03:42 AM

Quelle quantité de mémoire est nécessaire pour utiliser la base de données Oracle

Les tâches planifiées Oracle exécutent l'étape de création une fois par jour Les tâches planifiées Oracle exécutent l'étape de création une fois par jour May 10, 2024 am 03:03 AM

Les tâches planifiées Oracle exécutent l'étape de création une fois par jour

De quelle quantité de mémoire une base de données Oracle a-t-elle besoin ? De quelle quantité de mémoire une base de données Oracle a-t-elle besoin ? May 10, 2024 am 02:09 AM

De quelle quantité de mémoire une base de données Oracle a-t-elle besoin ?

Tutoriel détaillé sur l'établissement d'une connexion à une base de données à l'aide de MySQLi en PHP Tutoriel détaillé sur l'établissement d'une connexion à une base de données à l'aide de MySQLi en PHP Jun 04, 2024 pm 01:42 PM

Tutoriel détaillé sur l'établissement d'une connexion à une base de données à l'aide de MySQLi en PHP

Comment démarrer le programme d'écoute dans Oracle Comment démarrer le programme d'écoute dans Oracle May 10, 2024 am 03:12 AM

Comment démarrer le programme d'écoute dans Oracle

See all articles