您的位置:首页 > 数据库 > MySQL

【数据库原理】索引实例证明(一个单引号引发的MYSQL性能损失)

2017-01-16 17:07 645 查看
火苗来源地,原文地址:http://www.zendstudio.net/archives/single-quotes-or-no-single-quotes-in-sql-query/,看了这篇文章,主要是底下的那些评论,我决定做一些测试,来看看到底谁说的是对的。

一、navicat来测试:





二、MySql command line client:



为了避免工具造成误差,我们使用mysql explain执行两条语句,查看效果:



大家可以显而易见的看出来,当我们执行带单引号sql语句时,显示的是:



三、分析:

1、id、table就不用说了。

2、type:指的是mysql在表里面找到目标行的方式。常见的由差到好顺序:

                All--->index--->range--->ref--->eq_ref--->const,system--->NULL

      all:代表全表扫描,也就是mysql从头到尾扫描整张表;

      index:代表按照索引次序扫描表,也就是先读索引,再读实际的行,本质上还是全表扫描,只不过避免了排序,原因就是索引是排好序的;

      range:代表以范围的形式扫描索引,想想我们的分页,mysql的limit;

      ref:代表非唯一性索引访问;

      eq_ref:代表使用有唯一性索引查找(主键或唯一性索引);

      const:常量单词,代表在整个查询过程中表中最多只会有一条匹配行。比如说自增长id=1的肯定只有一行,只需读取一次表数据就能取得所需结果,而且表数据在分解执行计划是读取。而当整张表中只有一条数据,就会出现system,所以system是const的一个特例吧算是;

      NULL:指的是在优化过程中就已经得到结果,不需要再访问表或索引。

3、possible_keys:可能会被使用到的索引。

4、key:查询过程中实际使用到了的索引

5、key_len:索引字段最大可能使用的长度

6、ref:指出对key列所选择的索引的查找方式。常见的有const(只有一条),func(ref 为 func 的情况出现在子查询中,暂不明其原理),NULL,具体字段名。

7、rows:这个有意思,这个指的是Mysql估计自己需要扫描的行数,仅仅是一个估计,不代表实际扫了多少行,只是一个执行态度。

8、Extra:除上述之外其他信息,这个非常重要。常见的有:

     using index:此查询使用了覆盖索引(Covering Index),即通过索引就能返回结果,无需访问表。

     using where:表示 MySQL 服务器从存储引擎收到行后再进行“后过滤”(Post-filter)。所谓“后过滤”,就是先读取整行数据,再检查此行是否符合 where 句的条件,符合就留下,不符合便丢弃。因为检查是在读取行后才进行的,所以称为“后过滤”。

     using temporary:使用到临时表。

     using filesort:若查询所需的排序与使用的索引的排序一致,因为索引是已排序的,因此按索引的顺序读取结果返回,否则,在取得结果后,还需要按查询所需的顺序对结果进行排序,这时就会出现 Using filesort 。

四、拓展

本来,我怀疑做类型转换就有可能不会用到索引,可是当我把字段类型改成int类型之后,还继续查询那两条sql语句,效果是这样的:



它是使用索引的,所以,关于类型转换造成索引不能使用的解释就有点说不通了。但是可以确定的是,string类型的索引比数值型索引组织的要好一点,因为同样的数据,不同的数据类型,string时总是0ms,可是int时,有时会1ms。这就是差距。

五、总结:

       现在研究索引这块,所以总是介绍索引带来的好处,但是如果我们无度的使用索引,会给机器内存带来很大的压力,所以,什么东西都是慎用,讲究一个平衡。适当的使用索引会提高我们的检索速度,性能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: