|
本帖最后由 squall 于 2012-12-19 11:19 编辑
用个例子说明一下,表的结构:- mysql> show create table t\G;
- *************************** 1. row ***************************
- Table: t
- Create Table: CREATE TABLE `t` (
- `a` int(10) unsigned DEFAULT NULL,
- `b` int(10) unsigned DEFAULT NULL,
- KEY `i_t_a` (`a`),
- KEY `i_t_b` (`b`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 1 row in set (0.00 sec)
复制代码 在MySQL5.5中的表现:- mysql> select version();
- +-------------------------------------------+
- | version() |
- +-------------------------------------------+
- | 5.5.20-enterprise-commercial-advanced-log |
- +-------------------------------------------+
- 1 row in set (0.00 sec)
- mysql> explain select * from t where a=1 or b=10;
- +----+-------------+-------+------+---------------+------+---------+------+------+-------------+
- | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
- +----+-------------+-------+------+---------------+------+---------+------+------+-------------+
- | 1 | SIMPLE | t | ALL | i_t_a,i_t_b | NULL | NULL | NULL | 40 | Using where |
- +----+-------------+-------+------+---------------+------+---------+------+------+-------------+
- 1 row in set (0.00 sec)
- 可优化成:
- mysql> explain select * from t where a=1 union all select * from t where b=10;
- +----+--------------+------------+------+---------------+-------+---------+-------+------+---------+
- | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
- +----+--------------+------------+------+---------------+-------+---------+-------+------+---------+
- | 1 | PRIMARY | t | ref | i_t_a | i_t_a | 5 | const | 8 | Using where |
- | 2 | UNION | t | ref | i_t_b | i_t_b | 5 | const | 3 | Using where |
- | NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | |
- +----+--------------+------------+------+---------------+-------+---------+-------+------+------+
- 3 rows in set (0.00 sec)
复制代码 在MySQL5.6中的表现:- mysql> select version();
- +--------------+
- | version() |
- +--------------+
- | 5.6.6-m9-log |
- +--------------+
- 1 row in set (0.02 sec)
- mysql> explain select * from t where a=1 or b=10;
- +----+-------------+-------+-------------+---------------+---------+---------+------+------+-----+
- | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
- +----+-------------+-------+-------------+--------+-------------+---------+------+------+---------+
- | 1 | SIMPLE | t | index_merge | i_t_a,i_t_b | i_t_a,i_t_b | 5,5 | NULL | 11 | Using union(i_t_a,i_t_b); Using where |
- +----+-------------+-------+-------------+-------+-------------+---------+------+------+-----+
- 1 row in set (0.03 sec)
复制代码 结论,升级到5.6的时候要考虑SQL的索引及性能问题。
|
|