派生表和视图的性能
从MySQL 4.1开始,它已经支持派生表、联机视图或者基本的FROM从句的子查询。
这些特性之间彼此相关,但是它们之间的性能比较如何呢?
MySQL 5.0 中的派生表似乎和视图实现的方式不同,尽管我从合并的代码基数来看觉得在查询优化上应该是一样的。
派生表仍然以临时表的方式显式地处理,而且还是没有索引的临时表(因此最好不要像在例子中那样连接2个派生表)
需要考虑的另一方面是,派生表需要被显式处理,尽管只是执行 EXPLAIN 语句。因此如果在 FROM 字句中的 SELELCT 操作上犯了错误,例如忘记了写上连接的条件,那么 EXPLAIN 可能会一直在运行。
视图则不同,它无需被显式处理,只是把查询简单地重写了一下。只有在无法合并查询或者试图创建者请求时才需要被显式处理。
这意味着它们在性能上的差别如下:
在基本的表上执行有索引 的查询,这非常快
mysql> SELECT * FROM test WHERE i=5 ; +---+----------------------------------+ | i | j | +---+----------------------------------+ | 5 | 0c88dedb358cd96c9069b73a57682a45 | +---+----------------------------------+ 1 row IN SET ( 0 .03 sec)
在派生表上做同样的查询,则如老牛拉破车
mysql> SELECT * FROM ( SELECT * FROM test) t WHERE i=5 ; +---+----------------------------------+ | i | j | +---+----------------------------------+ | 5 | 0c88dedb358cd96c9069b73a57682a45 | +---+----------------------------------+ 1 row IN SET ( 1 min 40 .86 sec)
在视图上查询,又快起来了
mysql> CREATE VIEW v AS SELECT * FROM test; Query OK, 0 rows affected ( 0 .08 sec) mysql> SELECT * FROM v WHERE i=5 ; +---+----------------------------------+ | i | j | +---+----------------------------------+ | 5 | 0c88dedb358cd96c9069b73a57682a45 | +---+----------------------------------+ 1 row IN SET ( 0 .10 sec)
下面的2条EXPLAIN结果也许会让你很惊讶
mysql> EXPLAIN SELECT * FROM v WHERE i=5 ; +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+ | id | select_type | TABLE | type | possible_keys | KEY | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+ | 1 | PRIMARY | test | const | PRIMARY | PRIMARY | 4 | const | 1 | | +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+ 1 row IN SET ( 0 .02 sec) mysql> EXPLAIN SELECT * FROM ( SELECT * FROM test) t WHERE i=5 ; +----+-------------+------------+------+---------------+------+---------+------+---------+-------------+ | id | select_type | TABLE | type | possible_keys | KEY | key_len | ref | rows | Extra | +----+-------------+------------+------+---------------+------+---------+------+---------+-------------+ | 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 1638400 | USING WHERE | | 2 | DERIVED | test | ALL | NULL | NULL | NULL | NULL | 1638400 | | +----+-------------+------------+------+---------------+------+---------+------+---------+-------------+ 2 rows IN SET ( 54 .90 sec)
避免使用派生表 -- 如果可能,最好采用其他方式来编写查询语句,大部分情况都比派生表来的快。很多情况下,甚至连独立的临时表都来的快,因为可以适当增加索引。
可以考虑使用临时试图来取代派生表 如果确实需要在 FROM 子句中使用到子查询,可以考虑在查询时创建试图,当查询完之后删除试图。
不适合多表视图,多表时用派生表取代视图
explain select sum(pdm.qty) pre_total,pd.pre_doc_id from prepare_doc pd left join pre_doc_item pdm on pd.pre_doc_id=pdm.pre_doc_id group by pd.pre_doc_id
相关推荐
SQL优化 Explain的使用详解 mysql
SQL语句性能分析之explain
102 透彻研究通过explain命令得到的SQL执行计划(3).pdf
而我们在不考虑进行分库分表的操作时,进行SQL语句优化是一个很好的解决办法,下面介绍explain关键词分析SQL语句,及使用索引进行优化查询。 explain关键字使用 explain使用格式 EXPLAIN SELECT * FROM SCORE ...
2. SQL优化 2.1优化SQL的一般步骤 2.2 索引问题. 2.3两个常用的优化技巧 2.4常用SQL优化 2.5常用SQL技巧 3.优化数据库对象 3.1优化表的数据类型逆规范化 3.2提高查询速度 4.锁问题 4.1MyISQM表锁 4.2...
1.如何分析SQL语句 2.选用适合的ORACLE优化器 3.用EXPLAIN PLAN 分析SQL语句 4.使用TKPROF 工具来查询SQL性能状态 5.表分区的应用
4.EXPLAIN验证SQL是否走索引 5.结合autotrace创建并验证函数索引 6.sql trace分析工具--TKPROF详细讲解 7.V$SQL视图详解加几个实例 8.autotrace验证压缩表性能 9.autotrace验证消除子查询后的性能 10.基于基本的优化...
看懂MySQL的SQL EXPLAIN
知识点标签:explain、sql优化、索引、sql性能问题 题目描述 MySQL执行计划及SQL优化 1.SQL语句表头运行一个explain时,执行后所显示的表头字段如下: id : select查询的序列号,包含一组数字,表示查询中执行select...
Mysql数据库优化实战,里面有一些小的例子来说明执行计划的讲解。
面试官:不会看 Explain执行计划,简历敢写 SQL 优化?.mhtml
explain分析sql具体字段含义脑图
100 透彻研究通过explain命令得到的SQL执行计划(1).pdf
105 透彻研究通过explain命令得到的SQL执行计划(6).pdf
MySQL 性能优化 Explain ,MySQL 性能优化 ExplainMySQL 性能优化 ExplainMySQL 性能优化 ExplainMySQL 性能优化 ExplainMySQL 性能优化 ExplainMySQL 性能优化 ExplainMySQL 性能优化 Explain
非常全面的ORACLE SQL性能优化介绍及实例:优化器的选择、共享SQL语句、访问Table的方式、减少访问数据库的次数、使用DECODE函数、减少对表的查询、通过内部函数提高SQL效率、用NOT EXISTS替代NOT IN、使用EXPLAIN ...
106 透彻研究通过explain命令得到的SQL执行计划(7).pdf
执行方法的提示: USE_NL(使用NESTED LOOPS方式联合) USE_MERGE(使用MERGE JOIN方式联合) USE_HASH(使用HASH JOIN方式联合) 索引提示: INDEX(TABLE INDEX)(使用提示的表索引进行查询...
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。...
SQL_clear_explain_2nd.rar 学习sql排名第二的书