- 论坛徽章:
- 3
|
本帖最后由 ylky_2000 于 2013-05-21 09:33 编辑
首先可以明确:5.5和5.4版本是可以平滑升级的。
简单的进行测试查询如下:
1、分别在5.5和5.6版本中做如下操作:
CREATE TABLE t1(id int, PRIMARY KEY (id)) engine=innodb;
INSERT INTO t1(id) VALUES(1),(2),(3),(4),(5),(6),(7),(,(9),(10);
CREATE TABLE t2(rid int, id int, PRIMARY KEY (rid, id)) engine=innodb;
INSERT INTO t2(rid, id) VALUES(547, 1),(547, 2),(547, 5),(547, ,(203, 2),(203, 4),(203, ;
2、用explain查看执行结果:分开两个版本查询
mysql> SELECT VERSION();
+------------+
| VERSION() |
+------------+
| 5.5.30-log |
+------------+
1 row in set (0.01 sec)
mysql> explain SELECT * FROM t1 INNER JOIN t2 WHERE rid = 203 AND t2.id > 2 AND t2.id IN (SELECT t1.id FROM t1 INNER JOIN t2 USING(id) WHERE rid = 547);
+----+--------------------+-------+--------+---------------+---------+---------+------------+------+--------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+--------+---------------+---------+---------+------------+------+--------------------------------+
| 1 | PRIMARY | t2 | range | PRIMARY | PRIMARY | 8 | NULL | 2 | Using where; Using index |
| 1 | PRIMARY | t1 | index | NULL | PRIMARY | 4 | NULL | 10 | Using index; Using join buffer |
| 2 | DEPENDENT SUBQUERY | t2 | eq_ref | PRIMARY | PRIMARY | 8 | const,func | 1 | Using index |
| 2 | DEPENDENT SUBQUERY | t1 | eq_ref | PRIMARY | PRIMARY | 4 | func | 1 | Using where; Using index |
+----+--------------------+-------+--------+---------------+---------+---------+------------+------+--------------------------------+
4 rows in set (0.01 sec)
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.6.10 |
+-----------+
1 row in set (0.00 sec)
mysql> explain SELECT * FROM t1 INNER JOIN t2 WHERE rid = 203 AND t2.id > 2 AND t2.id IN (SELECT t1.id FROM t1 INNER JOIN t2 USING(id) WHERE rid = 547);
+----+-------------+-------+--------+---------------+---------+---------+------------------+------+----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+------------------+------+----------------------------------------------------+
| 1 | SIMPLE | t2 | ref | PRIMARY | PRIMARY | 4 | const | 1 | Using where; Using index |
| 1 | SIMPLE | t2 | eq_ref | PRIMARY | PRIMARY | 8 | const,test.t2.id | 1 | Using index |
| 1 | SIMPLE | t1 | eq_ref | PRIMARY | PRIMARY | 4 | test.t2.id | 1 | Using index |
| 1 | SIMPLE | t1 | index | NULL | PRIMARY | 4 | NULL | 10 | Using index; Using join buffer (Block Nested Loop) |
+----+-------------+-------+--------+---------------+---------+---------+------------------+------+----------------------------------------------------+
4 rows in set (0.00 sec)
3、比较执行的策略
从执行策略上讲,5.6强于5.5。在实际的环境中,5.6版本的执行速度要比5.5的慢。
mysql最忌讳用in一个子查询 更改成表连接,一般in语句都可以更改为join。
二、查询优化办法还是老办法
1、优化数据类型 避免使用null、尽可能使用更小的字段、
2、对字符转换的过程小心,utf-8的时候是否需要多字节,这个因为多字节需要更多的空间;
3、优化count(my_col)和count(*) ,使用MyISAM表,没有where子句的情况下使用count(*)速度快,主要是因为行数量统计非常精确,所以MySQL不会一行一行地去找,如my_col列没有空值,那么和前面说的情况会一样,即count(my_col)速度也会很快。如果有where子句时使用count( ),基本上就无法进行更多优化了,在where子句中超出了明显的索引列,对于复杂的where子句,只有使用覆盖索引才有用。
4、优化子查询 经常将子查询转换为连接查询。以上例子有这个方面的说明。 |
|