原文:两个容易被忽略的mysql知识

  为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql中遇到的一些commen sense类型的问题。

  1、varchar(5)可以存储多少个汉字,多少个字母数字?

  相信有好多人应该跟我一样,对这个已经很熟悉了,根据经验我们能很快的做出决定,比如说用varchar(200)去存储url等等,但是,即使你用了很多次也很熟悉了,也有可能对上面的问题做出错误的回答。

  这个问题我查了好多资料,有的人说是可以存储5个字符,2.5个汉字(每个汉字占用两个字节的话),有的人说这个要区分版本,5.0是个分界限,5.0之前是前面说的那样,5.0之后是可以存储5个“字”,不区分是数字、英文、汉字,果真是这样吗,我们来做个实验:

  

CREATE TABLE `test` (
`name` varchar(5) NOT NULL DEFAULT '',
`info` char(5) NOT NULL DEFAULT '',
PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

  

  可以看出varchar(5)中的5代表的是5个“字”,而不是5个字节(bytes),当我们存储长度超过制定长度的时候会将超过的部分“咔嚓”掉,我的mysql版本是5.6,字符集(charset)utf8和gbk是一样的。

  其他版本我电脑上没有,去官方文档看看有没有什么说明,在官方文档中查了半天终于发现了点区别:

  下面这段来自http://dev.mysql.com/doc/refman/4.1/en/char.html,是对mysq4.1的说明:

The CHAR and VARCHAR types are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR(30) can hold up to 30 characters. (Before MySQL 4.1, the length is interpreted as number of bytes.)

  再看看其他版本的类似的说明:

The CHAR and VARCHAR types are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR(30) can hold up to 30 characters.

  显而易见了,官方文档说了,mysql版本小于4.1的时候存储的时候符合说法:varchar(5)保存5个bytes,及5个英文数字或者2.5个汉字(假设一个汉字2个字节);

mysql版本大于等于4.1的时候varchar(5)中的5不再是字节数了,应该理解为“字”这里的字的意思是一个汉字和一个英文或者数字“相同对待”

  2、mysql中的limit,你真的会用吗?

  你在项目中怎么使用limit?limit num?还是limit num1,num2?还是其他的?要知道limit使用不同的形式性能差距很大的。

  我自己测试了下,在一张innodb表中去使用limit,表中10000条数据,四个字段,id(int)、time(int)、title(varchar)、body(mediumtext),大小大约170M左右,首先关掉查询缓存,免得查询缓存对查询时间有影响,这里要注意time字段上面加了索引,

SET @@query_cache_type=ON;
SET GLOBAL query_cache_size=0;

  打开Query profiler来查看语句执行所花费的时间

set profiling=1;

  接下来对下面几个语句进行执行

  a、SELECT id,TIME,title FROM cnblogs WHERE TIME>=1315646940 ORDER BY TIME ASC LIMIT 2000,10

  b、SELECT id,TIME,title FROM cnblogs WHERE TIME>=1315646940 ORDER BY TIME ASC LIMIT 10

c、 SELECT id,TIME,title FROM cnblogs ORDER BY TIME ASC LIMIT 3000,10

  执行顺序a,b,c,a,b,c,c,a,a(这里需要注意下,虽然我关闭了缓存,但是上一次的查询还是会缓存,这个可以从Query profiler中看出来,所以进行交叉执行),使用下面的语句查看结果

SHOW profiles;

  

  从上面的语句执行时间分析可以看出,不考虑缓存因素,当使用limit的时候,"limit begin,num"这种形式比"limit num"这种形式效率低很多,因此,在使用的时候尽可能的使用第二种形式,比如说要循环获取一个表里面的数据,一次取出来内从放不下,这个时候就要按照id(或者其他卡排序字段)进行limit了,我们就可以通过获取上次的该字段临界值作为下次取数据的最小值,使用limit begin,num这种形式效率会高很多。

  本文版权归作者iforever(luluyrt@163.com)所有,未经作者本人同意禁止任何形式的转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

两个容易被忽略的mysql知识的更多相关文章

  1. 几个容易被忽略的mysql知识

    为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql中遇到的一些commen sense类 ...

  2. MySQL知识树-查询语句

    在日常的web应用开发过程中,一般会涉及到数据库方面的操作,其中查询又是占绝大部分的.我们不仅要会写查询,最好能系统的学习下与查询相关的知识点,这篇随笔我们就来一起看看MySQL查询知识相关的树是什么 ...

  3. 小白两篇博客熟练操作MySQL 之 第二篇

    小白两篇博客熟练操作MySQL  之   第二篇 一. 视图 视图是一个虚拟表,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集, 并可以将其当做表来使用. s ...

  4. 【MySQL】MySQL知识图谱

    MySQL 文章目录 MySQL 表 锁 索引 连接管理 事务 日志系统 简单记录 极客时间 - MySQL实战45讲 MySQL知识图谱 表 表 引擎选择 编码问题 表空间管理 字段设计 备份和恢复 ...

  5. 小白两篇博客熟练操作MySQL 之 第一篇

    小白两篇博客熟悉操作MySQL  之   第一篇 一.概述 1. 什么是数据库? 答: 储存数据的仓库, 如: 在ATM的事例中创建的一个db 目录, 称为数据库 2. 什么是Mysql, Oracl ...

  6. MySQL不常用、易忽略的小知识

    笔者从事开发也有一段时间了,关于数据库方面的一些小知识在这里总结一下 1.count(*),count(1)与count(column)区别 count(*)对行的数目进行计算,包含NULL coun ...

  7. [mysql]知识补充

    知识概况 视图 函数 存储过程 事务 索引 触发器 [视图] 视图是一个虚拟表,可以实现查询功能,不能进行增删改 本质:根据sql语句获取动态的数据集,并为其命名 1.创建视图 --create vi ...

  8. mysql知识初篇(一)

    mysql介绍 (1) mysql数据库是瑞典AB开发. (2) mysql--> sun --> oracle. (3) mysql数据库的特点. 1. 开源. 2. 免费. 3. 跨平 ...

  9. 【Mysql知识补充】

    一.子查询 1.定义 子查询是将一个查询语句嵌套在另一个查询语句中.内层查询语句的查询结果,可以为外层查询语句提供查询条件.子查询中可以包含:IN.NOT IN.ANY.ALL.EXISTS 和 NO ...

随机推荐

  1. 解决PhpCms V9后台无法上传图片

    PHPCMS V9 在近期一次更新的版本号(9.4.2)中因为代码推断失误.导致PHPCMS在后台更新文章无法上传图片而导致的bug.在PHPCMS论坛中找到了暂时解决方式,希望PHPCMS官方能尽快 ...

  2. toString()和String.valueof()比较

     toString()和String.valueof()比较 做项目时常常会用到类型转换,比较常用的是toString(),但其实还是用String.valueof()比较好.看源码后他们的区别就更加 ...

  3. Hibernate一个简短的引论

    我们从几个方面进行阐述Hibernate When? What ? How? When? Hibernate由来是因为当时EJBBean1.1在处理entittBean架构时,花费的时间要比业务逻辑很 ...

  4. C++该函数隐藏

    只有基类成员函数的定义已声明virtualkeyword,当在派生类中的时间,以支付功能实现,virtualkeyword可以从时间被添加以增加.它不影响多状态. easy混淆视听,掩盖: ,规则例如 ...

  5. 为了解决这个问题:07文本WORD文档超链接、页码成{HYPERLINK"网站"}、{PAGE}/{NUMPAGES}

    版权声明:本文博主原创文章.博客,未经同意不得转载.

  6. 思维导图之C++语言程序设计总结

    花了大约一周的时间,将c++的课本过了一遍,米老师说第一遍不求甚解,仅仅管去看就能够了,我很成功地运行了老师这种方法,嘿嘿.那么c++是什么呢?百度上这样说,它是一种使用很广泛的计算机编程语言.C++ ...

  7. 它们的定义dialog

    (1)你需要准备自己的自定义对话框样式,是一个布局文件 <?xml version="1.0" encoding="utf-8"? > <Li ...

  8. 【翻译】Ext JS最新技巧——2014-10-30

    原文:Top Support Tips Greg Barry:Ext JS 5的ExtraParams Ext JS 4同意用户直接将extraParams加入到一个链接,相似例如以下代码: Ext. ...

  9. 初步boost之pool图书馆学习笔记

    pool 内存池概述 通常我们习惯直接使用new.malloc等API申请分配内存,这样做的缺点在于:因为所申请内存块的大小不定.当频繁使用时会造成大量的内存碎片并进而减少性能. 内存池则是在真正使用 ...

  10. 物理卷操作命令:pvcreate,pvscan,pvdisplay.卷组操作命令:vgcreate,vgdisplay. (转)

    新硬盘创建LVM系统过程. 物理卷操作命令:pvcreate,pvscan,pvdisplay. 卷组操作命令:vgcreate,vgdisplay. 逻辑卷操作命令:lvcreate,lvdispl ...