对于存储和计算来说, INT(1) 和 INT(20) 是相同的。 2.实数类型 实数是带有小数部分的数字。...3.字符串类型 VARCHAR 用于存储可变⻓字符串,长度支持到65535 需要使用1或2个额外字节记录字符串的长度 适合:字符串的最大⻓度比平均⻓度⼤很多;更新很少 CHAR 定⻓,⻓度范围是1~...ENUM和SET列适合存储固定信息, 例如有序的状态、 产品类型、 人的性别。 字符串类型 如果可能, 应该避免使用字符串类型作为标识列, 因为它们很消耗空间, 并且通常比数字类型慢。...低千秒级精度的时间戳就是一个例子,另一个例子是以个1Pv4地址,人们经常使用VARCHAR(15)列来存储IP地址,然而, 它们实际上是32位无符号整数, 不是字符串。...当数据比内存大时这可能比关联要快得多,因为这样避免了随机I/0。 单独的表也能使用更有效的索引策略。
3、数据类型越短越好,尽量避免NULL(NULL索引,统计,比较更复杂,可为NULL的列需要的存储空间更多) 4、整数(tinyint 8位,smallint 16位,mediumint 24位,int...,每4个字节存储9个数字,小数点占一个字节 6、float 在存储相同范围的数据,占用存储空间比decimal小,float 使用4个字节存储,double占用8个字节 7、varchar 存储变成字符串...8、以下情况适合使用varchar[高性能MySQL(第3版)p115]: 字符串最大长度比平均长度大很多,列的更新少(不会产生碎片);使用类似UTF8字符集,每个字符使用不同字节数存储 9、char...枚举列,字符串列表是固定的,每次添加修改都需要使用alter table。将char,varchar 和枚举类型关联时,会比直接cahr,varchar关联慢。...对于in中有大量值时,in查询比or快 18、mysql 文件排序需要的空间比想象的要大得多,因为mysql会给排序记录分配足够长度的固定长度的空间,排序消耗的临时空间比磁盘上原有空间大得多。
可为NULL的列会使用更多的存储空间,在 MySQL里也需要特殊处理。 在为列选择数据类型时: 第一步需要确定合适的大类型:数字、字符串、时间等; 第二步是选择具体类型。...对于存储和计算来说,INT(1)和INT(20)是相同的 2.2、实数类型 实数是带有小数部分的数字。...2.4、位数据类型 可以使用BIT列存储一个或多个true/false值,BIT(1)包含单个位的字段,最多可包含64个位。 MySQL将BIT当做字符串类型,而不是数字类型。...当查询BIT(1)时,结果是一个包含二进制0或1的字符串,而不是ASCII码中的“0”或“1”。 BIT列进行比较时,MySQL会将位字符串转换为十进制数字进行比较。 例如:‘111’ = 7。...一般来说,在没有特殊要求的情况下,整型 通常是标识列最好的选择,因为它很快,而且可以自动递增。 如果可以的话,应该尽量避免使用字符串当做标识列,它很消耗空间,而且比整型慢。
如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL的列使得索引、索引统计和值比较都更复杂。可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊处理。...对于存储和计算来说,INT(1) 和 INT(20)是相同的。 1.2 实数类型 实数是带有小数部分的数字。然而,它们不只是为了存储小数部分;也可以使用DECIMAL存储比BIGINT还大的整数。...字符串类型 字符串类型很消耗空间,且通常比数字类型慢,所以也应避免使用字符串作为标识列。 对于完全“随机”的字符串也需要多加注意,例如MD5()、SHA1()或者UUID()产生的字符串。...IPv4 地址 人们经常使用VARCHAR(15)列来存储IP地址。然而,它们实际上是32位无符号整数,不是字符串。用小数点将地址分成四段的表示方法只是为了让人们阅读容易。...如果不需要关联表,则对大部分查询最差的情况——即使表没有使用索引——是全表扫描。当数据比内存大时这可能比关联要快得多,因为这样避免了随机 I/O 。 单独的表也能使用更有效的索引策略。
大部分人在创建数据库表时,基本一股脑的使用INT、VARCHAR这两种类型最多,至于长度,则会选择足够大即可,避免日后不够用咋办。只顾当时一时爽,之后坑谁谁难受。...VARCHAR需要使用1或2个额外的字节来记录字符串的长度(如果字段的最大长度小于或等于255字节,则只使用1个字节表示长度,否则使用2个字节来表示长度)。...TIMESTAMP只使用4个字节的存储空间,因此它的范围比DATETIME小得多,只能表示从1970年到2038年。...2.字符串类型 如果可以避免,尽可能的避免使用字符串类型作为标识列的类型,因为它很消耗空间,并且通常比数字类型慢。...尤其是在MyISAM存储引擎的表里使用字符串作为标识列时,要特别的小心,MyISAM默认对字符串使用压缩索引,这会导致查询慢很多。
当字符串的最大长度比平均长度大很多时;列的更新很少;使用了UTF-8时比较适合用VARCHAR。MySQL在存储和检索时会保留末尾空格。InnoDB会把过长的VARCHAR存储为BLOB。...CHAR适合存储很短的字符串,或者所有值都接近于一个长度。CHAR适合存储密码的MD5值,对于不经常变更的值CHAR也比较合适。对于比较短的列,CHAR比VARCHAR在存储空间上也更有效率。...MySQL比较BINARY字符串时,每次按一个字节,并且根据该字节的数值进行比较,因此二进制比较比字符比较简单得多,所以更快。...MySQL不能将BLOB和TEXT列全部长度的字符串进行索引,也不能使用这些索引消除排序。...这样会导致混乱 枚举的顺序是按照背地里的数字来排序的,因此,你的Order by语句可能得不到按字符串排序的结果。解决方案就是声明的时候就把字符串排好序,枚举常量对应的数字是和声明时的顺序有关的。
如下: 如果给数字加上'',也就是说,传的是一个字符串呢,当然是走索引,如下图: 为什么第一条语句未加单引号就不走索引了呢?...这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为浮点数再做比较。隐式的类型转换,索引会失效。...使用force index 强行选择某个索引 修改你的SQl,引导它使用我们期望的索引 优化你的业务逻辑 优化你的索引,新建一个更合适的索引,或者删除误用的索引。...那为什么不慢?其实是因为写redo log的过程是顺序写磁盘的。磁盘顺序写会减少寻道等待时间,速度比随机写要快很多的。 7.3 为什么会出现脏页呢?...8. order by 文件排序 order by就一定会导致慢查询吗?不是这样的哈,因为order by平时用得多,并且数据量一上来,还是走文件排序的话,很容易有慢SQL的。
例如,指定一个字段的类型为 INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。...而 VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度(增加一个额外字节来存储字符串本身的长度)来存储值。...MySQL 认为 ENUM 类型集合中出现的值是合法输入,除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为 0 的行就可以很容易地找到错误记录的位置。...选择相对简单的数据类型 数字类型相对字符串类型要简单的多,尤其是在比较运算时,所以我们应该选择最简单的数据类型,比如说在保存时间时,因为PHP可以良好的处理LINUX时间戳所以我们可以将日期存为int(...VARCHAR与CHAR VARCHAR是可变长度字符串类型,那么即然长度是可变的就会使用1,2个字节来保存字符的长度,如果长度在255内使用1个字节来保存字符长度,否则使用2个字符来保存长度。
思考题 为什么InnoDB存储引擎选择使用B+Tree索引结构?...如果是字符串头部模糊匹配,索引失效。 使用or来连接条件: 用or分割开的条件,如果or前的条件中的列有索引,而or后面的列中没有索引,那么涉及的索引都不会被用到。...前缀索引: 当字段类型为字符串(varchar,text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率。...选取部分前缀建立索引 CREATE INDEX 索引名 ON 表名(column(前缀长度)); 前缀长度: 可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高...3.尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。 4.如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
索引优化 创建示例表 CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT...如果满足查询要求,尽量使用覆盖索引,即索引包含了查询涉及的所有字段,避免进行额外的数据检索操作。...避免在小基数字段上建立索引:小基数字段指的是字段的值较少且有限,即字段有多少不同的值。比如性别(男、女)对应的字段基数就是 2。...使用前缀索引处理长字符串:对于较大的字符串类型字段,可以考虑使用前缀索引。例如,可以只针对字段的前几个字符建立索引,以减少磁盘空间占用。...先进行 WHERE 筛选得到的数据集一般小很多,再进行排序成本就会小很多。 基于慢 SQL 查询进行优化:通过监控慢查询,并针对这些慢查询进行特定的索引优化。根据慢查询的特点,调整索引设计来提升性能。
查询出比较慢的 SQL 语句,然后再通过 Explain 来查询 SQL 语句的执行计划,最后分析并定位出问题的根源,再进行处理 慢查询日志指的是在 MySQL 中可以通过配置来开启慢查询日志的记录功能...简单的数据类型操作代价更低,比如:能使用 int 类型就不要使用 varchar 类型,因为 int 类型比 varchar 类型的查询效率更高 尽量少定义 text 类型 text 类型的查询效率很低...整数类型宽度设置 MySQL可以为整数类型指定宽度,例如int(11),实际上并没有意义,它并不会限制值的范围,对于存储和计算来说,int(1)和int(20)是相同的 VARCHAR和CHAR类型...char类型是定长的,而varchar存储可变字符串,比定长更省空间,但是varchar需要额外1或2个字节记录字符串长度,更新时也容易产生碎片 需要结合使用场景来选择:如果字符串列最大长度比平均长度大很多...,或者列的更新很少,选择varchar较合适;如果要存很短的字符串,或者字符串值长度都相同,比如MD5值,或者列数据经常变更,选择使用char类型 DATETIME和TIMESTAMP类型 datetime
varchar与char的区别: char是一种固定长度的类型varchar则是一种可变长度的类型.varchar(32)中32的涵义 : 最多存放32个字节int(20)中20的涵义: int(M)中的...比如 course_id 在 student_info 表和 course 表中都为 int(11) 类型,而不能一个为 int 另一个为 varchar 类型7、使用列的类型小的创建索引8、使用字符串前缀创建索引创建一张商户表...截取得多了,达不到节省索引存储空间的目的;截取得少了,重复内容太多,字段的散列度(选择性)会降低。怎么计算不同的长度的选择性呢?...平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。为什么不是平衡二叉树呢?我们知道,在内存比在磁盘的数据,查询效率快得多。...密码散列,盐,用户身份证号等固定长度的字符串,应该使用char而不是varchar来存储,这样可以节省空间且提高检索效率。46、Innodb的事务实现原理?
, PRIMARY KEY (`id`) ); 为什么建表时没有指定主键,MySQL 会默认使用一个隐式字段 ROWID 字段构建聚簇索引?...这里回答了上面的问题,为什么 MySQL 一定要有主键索引,因为主键索引子节点中包含了全部数据 4.3 索引覆盖 CREATE TABLE `user` ( `id` int(11) NOT NULL...同时因为 varchar 是变长字符串,需要额外地字节存放字符长度,共两个字节,此外,name 字段可以为 null 值,null 值单独占用一个字节,加在一起一共 63 个字节 9、ref 当使用索引列等值匹配的条件去执行查询时...10、rows 预计需要扫描的函数 11、filtered filtered 这个是一个百分比的值,表里符合条件的记录数的百分比。...5.3.3 尽量使用覆盖索引 覆盖索引,需要查询的字段全部包含在索引列中,不需要回表查询
,如果查询条件传了一个数字过去,它是不走索引的,如图所示: ?...如果给数字加上'',也就是传一个字符串呢,当然是走索引,如下图: ? 分析与结论: 为什么第一条语句未加单引号就不走索引了呢?...这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为浮点数再做比较。 三、like通配符可能导致索引失效。...可以有两种方式优化: 使用覆盖索引 把%放后面 附: 索引包含所有满足查询需要的数据的索引,称为覆盖索引(Covering Index)。...总结 总结了索引失效的十大杂症,在这里来个首尾呼应吧,分析一下我们生产的那条慢sql。
比如: varchar(20),可以存20个中文、英文、符号,不要无脑使用varchar(150) 3、整形比字符操作代价更低。...另一方面,TIMESTAMP允许的时间范围要小得多,有时候它的特殊能力会变成障碍 整数类型 1、TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT分别使用8(-127~127...实数类型 1、实数是带有小数部分的数字。然而它们不只是为了存储小数部分,还可以使用DECIMAL存储比BIGINT还大的整数。MySQL既支持精确类型,也支持不精确类型。...6、MySQL不能将BLOB和TEXT列全部长度的字符串进行索引,也不能使用这些索引消除排序。...2、应避免使用字符串类型作为标志符,因为它们很消耗空间,并且通常比数字类型慢,有其是在MyISAM表中使用字符串作为标识符要特别小心,MyISAM默认对字符串压缩索引,这会导致查询慢很多。
呢、我们可以通过慢查询日志来查看慢SQL。...ref_or_null:这种连接类型类似于ref,区别在于MySQL会额外搜索包含NULL值的行 index_merge:使用了索引合并优化方法,查询使用了两个以上的索引。...对于InnoDB表,此数字是估计值,并非一定是个准确值。 1.2.3 filtered 该列是一个百分比的值,表里符合条件的记录数的百分比。...如下: 如果给数字加上'',也就是说,传的是一个字符串呢,当然是走索引,如下图: 为什么第一条语句未加单引号就不走索引了呢?...这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为浮点数再做比较。隐式的类型转换,索引会失效。
InnoDB引擎的4大特性 存储引擎选择 数据库基础知识 1、为什么要使用数据库 (1)数据保存在内存 优点: 存取速度快 缺点: 数据不能永久保存 (2)数据保存在文件 优点: 数据永久保存 缺点:...1)速度比内存操作慢,频繁的IO操作。...3、字符串类型,包括VARCHAR、CHAR、TEXT、BLOB VARCHAR用于存储可变长字符串,它比定长类型更节省空间。 VARCHAR使用额外1或2个字节存储字符串长度。...列长度小于255字节时,使用1字节表示,否则使用2字节表示。 VARCHAR存储的内容超出设置的长度时,内容会被截断。 CHAR是定长的,根据定义的字符串长度分配足够的空间。...使用策略: 对于经常变更的数据来说,CHAR比VARCHAR更好,因为CHAR不容易产生碎片。 对于非常短的列,CHAR比VARCHAR在存储空间上更有效率。
例如,指定一个字段的类型为 INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。...而 VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度(增加一个额外字节来存储字符串本身的长度)来存储值。...MySQL 认为 ENUM 类型集合中出现的值是合法输入,除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为 0 的行就可以很容易地找到错误记录的位置。...选择相对简单的数据类型 数字类型相对字符串类型要简单的多,尤其是在比较运算时,所以我们应该选择最简单的数据类型,比如说在保存时间时,因为PHP可以良好的处理LINUX时间戳所以我们可以将日期存为int(...VARCHAR与CHAR VARCHAR是可变长度字符串类型,那么即然长度是可变的就会使用1,2个字节来保存字符的长度,如果长度在255内使用1个字节来保存字符长度,否则使用2个字符来保存长度。
如下: 如果给数字加上”, 也就是说,传的是一个字符串呢,当然是走索引,如下图: 为什么第一条语句未加单引号就不走索引了呢?...这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL 会做隐式的类型转换,把它们转换为浮点数再做比较。隐式的类型转换,索引会失效。...2.2 查询条件包含 or,可能导致索引失效 我们还是用这个表结构: CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT, userId varchar...使用 force index 强行选择某个索引 修改你的 SQl,引导它使用我们期望的索引 优化你的业务逻辑 优化你的索引,新建一个更合适的索引,或者删除误用的索引。...那为什么不慢?其实是因为写 redo log 的过程是顺序写磁盘的。磁盘顺序写会减少寻道等待时间,速度比随机写要快很多的。 7.3 为什么会出现脏页呢?
领取专属 10元无门槛券
手把手带您无忧上云