- varchar(50)中50的涵义最多存放50个字符. 所以当使用了中文的时候(UTF8)意味着可以插入m个中文,但是实际会占用m*3个字节. 最多存储2^16−1 65533个字节(起始结束各占一字节)
varchar则是一种可变长度的类型. varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存.
char的上限为255字节,varchar的上限65535字节,text的上限为65535字节。
varchar(M),如果使用UTF-8编码,一个字符占3个字节,那么M最大为21844.
存储时超过char和varchar的n设置后,字符串会被截断。
定义时 字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766; 字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。
char(n)不管实际value都会占用n个字符的空间. char在存储的时候会截断尾部的空格,varchar和text不会。
- int(n)中不论n指定为多少,范围都一样-2312^31-1,都能插入9位数字。也就是说 int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间.
n只是一个显示宽度而已. 当创建表时设置了zerofill参数
create table tb2 (id1 int(3) zerofill , id2 int(5));
如果实际插入的数据宽度小于字段设置的显示宽度N时,将自动在数字前填充0。
如果插入的数据宽度大于设置的显示宽度N时,并不会出现数据无法插入或数据被截断的情况。
- LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
mysql> SELECT * FROM table LIMIT 95,-1; // 检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行. LIMIT n 等价于 LIMIT 0,n
注意: 对于有大数据量的mysql表来说,使用LIMIT分页存在很严重的性能问题。
SELECT * FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 30; //平均用时6.6s
SELECT * FROM `cdb_posts` WHERE pid >= (SELECT pid FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 1) LIMIT 30; //平均0.6s
因为要取出所有字段内容,第一种需要跨越大量数据块并取出,而第二种基本通过直接根据索引字段定位后,才取出相应内容,效率自然大大提升。对limit的优化,不是直接使用limit,而是首先获取到offset的id,然后直接使用limit size来获取数据。
网友评论