三,实例
1,单表数据太少,索引反而会影响速度
mysql> call i_test(10,'test_t'); //向test_t表插入10条件
Query OK, 1 row affected (0.02 sec)
mysql> select num from test_t where num!=0;
mysql> explain select num from test_t where num!=0\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test_t
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 10
Extra: Using where
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> create index num_2 on test_t (num);
Query OK, 10 rows affected (0.19 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> select num from test_t where num!=0;
mysql> explain select num from test_t where num!=0\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test_t
type: index
possible_keys: num_2
key: num_2
key_len: 4
ref: NULL
rows: 10
Extra: Using where; Using index
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> show profiles;
+----------+------------+---------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+---------------------------------------------+
| 1 | 0.00286325 | call i_test(10,'test_t') | //插入十条数据
| 2 | 0.00026350 | select num from test_t where num!=0 |
| 3 | 0.00022250 | explain select num from test_t where num!=0 |
| 4 | 0.18385400 | create index num_2 on test_t (num) | //创建索引
| 5 | 0.00127525 | select num from test_t where num!=0 | //使用索引后,差不多是没有使用索引的0.2倍
| 6 | 0.00024375 | explain select num from test_t where num!=0 |
+----------+------------+---------------------------------------------+
6 rows in set (0.00 sec)
解释:
id:表示sql执行的顺序
select_type:SIMPLE,PRIMARY,UNION,DEPENDENT UNION,UNION RESULT,SUBQUERY,DEPENDENT SUBQUERY,DERIVED不同的查询语句会有不同的select_type
table:表示查找的表名
type:表示使用索引类型,或者有无使用索引.效率从高到低const、eq_reg、ref、range、index和ALL,其实这个根你sql的写法有直接关系,例如:能用主键就用主键,where后面的条件加上索引,如果是唯一加上唯一索引等
possible_keys:可能存在的索引
key:使用索引
key_len:使用索引的长度
ref:使用哪个列或常数与key一起从表中选择行,一般在多表联合查询时会有。
rows:查找出的行数
Extra:额外说明
前段时间写过一篇博文mysqldistinct和group by谁更好,里面有朋友留言,说测试结果根我当时做的测试结果不一样,当时我打比方解释了一下,今天有时间,以例子的形势,更直观的表达出索引的工作原理。
2,where后的条件,order by ,group by 等这样过滤时,后面的字段最好加上索引。根据实际情况,选择PRIMARY KEY、UNIQUE、INDEX等索引,但是不是越多越好,要适度。
3,联合查询,子查询等多表操作时关连字段要加索引
mysql> call i_test(10,'test_test'); //向test_test表插入10条数据
Query OK, 1 row affected (0.02 sec)
mysql> explain select a.num as num1,b.num as num2 from test_t as a left join tes
t_test as b on a.num=b.num\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: a
type: index
possible_keys: NULL
key: num_2
key_len: 4
ref: NULL
rows: 10
Extra: Using index
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: b
type: ref
possible_keys: num_1
key: num_1
key_len: 4
ref: bak_test.a.num //bak_test是数据库名,a.num是test_t的一个字段
rows: 1080
Extra: Using index
2 rows in set (0.01 sec)
ERROR:
No query specified
数据量特别大的时候,最好不要用联合查询,即使你做了索引。
推荐阅读:
2018年全国计算机二级MySQL章节知识点:Mysql的优化方法
出国留学网计算机等级考试 栏目推荐: