一个单引号引发的MYSQL性能问题分析

对于大型的系统而言,Oracle,SQLServer无疑是最好的选择,可看看现在越来越多的小网站,他们没有自己的服务器,只是买别人的空间和数据库,但这种小型的数据库在性能上当然和大型数据库没有对比性,但小型的数据库也要对自己的优化方式,今天和大家分享Mysql中加没加单引号的巨大区别,对于MYSQL性能优化很有意义。

刚刚我们说过了,生活中难免会有一些不如意,比如,我们用一个字符串类型的字段来作为主键,表面上,这太不如意了,然而,事实也证明这是有用的。问题也就出来了,当在查询语句中对该字段值加上单引号和不加查询耗时相差百倍!

测试表:


代码如下:

CREATE TABLE `foo` ( `key` varchar(10) NOT NULL, `time` int(11) NOT NULL, PRIMARY KEY (`key`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;

然后插入30多万条数据,然后执行下面的SQL语句:


代码如下:

SELECT *FROM `foo`WHERE `key` =1293322797

查询花费 0.1288 秒,大约花费这么久的时间,然后,给1293322797加上单引号:


代码如下:

SELECT *FROM `foo`WHERE `key` ='1293322797'

查询花费 0.0009 秒,基本上相差100倍!!!也就是说不加单引号MYSQL性能损失了100倍,很震撼的比例!

后来用EXPLAIN分别跑了一下上面两条语句,见下面两张图:


没有单引号时


有单引号时

很明显,不使用单引号没有用上主索引,并进行了全表扫描,使用单引号就能使用上索引了。
后来我用大于分别进行了测试,返回的结果集相同,而他们的耗时和上面一样,用EXPLAIN测试,也和上面一样


代码如下:

SELECT *FROM `foo`WHERE `key` >1293322797SELECT *FROM `foo`WHERE `key` >'1293322797'

加单引号和不加单引号就是这么大的差别!就是会对mysql性能产生这么大的影响。
再后来,我将字段`key`换成INT类型,这时候,加不加单引号,就没有什么差别了,EXPLAIN显示他们都同样能够用上主索引,只是key_len变短了。

就是这些,综上所述,我们在写SQL查询的时候还是不厌其烦的加上单引号吧,似乎那没有坏处。

(0)

相关推荐

  • 关于Mysql查询带单引号及插入带单引号字符串问题

    Mysql查询带引号和不带引号区别 当数据库字段ID为整型时 select ID from table where ID=1 和 select ID from table where ID='1' 两条sql都是可以的,但是第一条sql不用进行隐式转换,速度上比第二条sql略快一些 今天在向mysql数据库中插入带单引号字符串的时候,什么错也没报就是语句执行失败,后来才知道,单引号等要转义,可以使用函数:mysql_real_escape_string和addslashes函数: 以下做个介绍:

  • sql语句中单引号,双引号的处理方法

    下面我们就分别讲述,虽然说的是Insert语句, 但是Select.Update.Delete语句都是一样的. 假如有下述表格:          mytabe          字段1    username     字符串型(姓名)          字段2    age          数字型(年龄)          字段3    birthday      日期型(生日)          字段4    marry        布尔型(是否结婚,结婚为True,未结婚为False)

  • SQL注入中绕过 单引号 限制继续注入

    包括我写的那篇<SQL Injection的实现与应用>也是这样的例子,因为没有碰到任何的过滤,所以使我们相当轻松就注入成功了,如下: 复制代码 代码如下: http://www.jb51.net/show.asp?id=1;exec master.dbo.xp_cmdshell 'net user angel pass /add';-- 这往往给大家造成误解,认为只要变量过滤了'就可以防止SQL Injection攻击,这种意识为大量程序可以注入埋下祸根,其实仅仅过滤'是不够的,在'被过滤的

  • 一个单引号引发的MYSQL性能问题分析

    对于大型的系统而言,Oracle,SQLServer无疑是最好的选择,可看看现在越来越多的小网站,他们没有自己的服务器,只是买别人的空间和数据库,但这种小型的数据库在性能上当然和大型数据库没有对比性,但小型的数据库也要对自己的优化方式,今天和大家分享Mysql中加没加单引号的巨大区别,对于MYSQL性能优化很有意义. 刚刚我们说过了,生活中难免会有一些不如意,比如,我们用一个字符串类型的字段来作为主键,表面上,这太不如意了,然而,事实也证明这是有用的.问题也就出来了,当在查询语句中对该字段值加上

  • pgsql 解决包含有单引号的字符串操作

    有时候我们项目中会遇到查询的字符串比较特殊:如自己本身待单引号 此时查询肯定报错.那么处理方式也很简单 只需要这样加一个单引号 这样就可以解决了 解决方式和MySQL方式不一样. 补充:pgsql搜索条件包含单引号 postgresql查询关键字有时候会遇到英文单引号的情况,比如你要查询一个英文句子 It's my love 好吧,这里会发现遇到了一个问题.(')单引号是postgresql中表示值的符号.比如 select * from mydoc WHERE code Like '%%' 大

  • mybatis 对于生成的sql语句 自动加上单引号的情况详解

    目录 对于生成的sql语句 自动加上单引号的情况 mySQL中replace的用法 mybatis中IFNULL(P1,P2)函数的用法 mybatis单引号字母逻辑处理的一个坑 原因分析 对于生成的sql语句 自动加上单引号的情况 mybatis是这样的,如果表的字段跟系统字段冲突,写sql语句的时候必须得加上单引号,这样才会区分 mySQL中replace的用法 1.replace into replace into table (id,name) values('1','aa'),('2'

  • PHP 单引号与双引号的区别

    1.定义字符串 在PHP中,字符串的定义可以使用单引号,也可以使用双引号.但是必须使用同一种单或双引号来定义字符串,如:'Hello"和"Hello'为非法的字符串定义. 定义字符串时,只有一种引号被视为定义符,即单引号或双引号.于是,如果一个字符串由双引号开始,那么只有双引号被分析器解析.这样,你就可以在双引号串中包含任何其他字符,甚至单引号.下面的引号串都是合法的: Php代码 复制代码 代码如下: $s = "I am a 'single quote string' i

  • php中的单引号、双引号和转义字符详解

    PHP单引号及双引号均可以修饰字符串类型的数据,如果修饰的字符串中含有变量(例$name):最大的区别是: 双引号会替换变量的值,而单引号会把它当做字符串输出. 例如: <?php $name="string"; echo " 字符串" . '$name'; echo "字符串" . "$name"; ?> 结果: 字符串$name 字符串string 转义字符,顾名思义会将规定的语法用"\"来

  • python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算

    python3中的字符串是一种常见的数据类型. 字符串有多种表现形式:单引号.双引号和三引号,且这些字符串的表现形式(单.双.三)都必须是成对出现的. 单.双引号是英文的:''和"",三引号则是三个单引号或者三个双引号都可以:""" """或者''' ''',在python中打出来时没有顺序之分(其实也看不出来顺序...),在一对引号的中间打上东西就是字符串,例如: #单引号# '123' '小明' 'xyz' #双引号# &

  • python实现mysql的单引号字符串过滤方法

    本文实例讲述了python实现mysql的单引号字符串过滤方法.分享给大家供大家参考,具体如下: 最主要用这个函数,可以处理MySQLdb.escape_string(content). class Guide: def __init__(self): self.time_zone = 7*3600 #设置时区 self.now_time = int(time.time()) + self.time_zone #取得当前时间 #本地 self.gamedb_model = mysql_conn.

  • 每天一个Linux命令之shell单引号和双引号的经典解释

    01 经典解释 单引号:所见即所得 双引号:所见非所得,它会先把变量解析之后,再输出 反引号(``) :命令替换,通常用于把命令输出结果传给入变量中 反斜杠( \ ) :转义字符/逃脱字符,Linux如果echo要让转义字符发生作用,就要使用-e选项,且转义字符要使用双引号 02 实例演示 请先看下面这个例子: [root@dev2~] echo "$HOME" /root [root@dev2~] echo '$HOME' $HOME 从上面的例子就可以体现出单引号所见即所得,双引号

  • mysql语句如何插入含单引号或反斜杠的值详解

    前言 本文主要给大家介绍了关于mysql语句插入含单引号或反斜杠值的相关内容,下面话不多说了,来一起看看详细的介绍吧 比如说有个表,它的结构是这个样子的 CREATE TABLE `activity` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `title` varchar(255) NOT NULL COMMENT '活动标题', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET

随机推荐