我们知道倒序输出是很简单的 select * from table order by id desc 直接这样就可以 那么现在的问题在于日期字段怎么来倒序输出 这里我们用到cast()来将指定的字段转换为我们需要的类型...经过查阅资料得知类型的转换有两种方式 1.cast()方法 2.convert()方法 使用格式 1.cast(字段名 as 数据类型) 如上述sql语句 cast(date as datetime)...2.convert(字段名,数据类型) 例:convert(da,datetime) 记录下来,留待后查,也方便别人。
同事提了个需求,如下测试表,有code、cdate和ctotal三列,select * from tt;现在要得到code的唯一值,但同时带着cdate和ctotal两个字段。...distinct支持单列去重和多列去重,如果是单列去重,简明易懂,即相同值只保留1个,如下所示,select distinct code from tt;多列去重则是根据指定的去重列信息进行,即只有所有指定的列信息都相同...实际上当distinct应用到多个字段的时候,其应用的范围是其后面的所有字段,而不只是紧贴着它的一个字段,即distinct同时作用了三个字段,code、cdate和ctotal,并不只是code字段,...错误 [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL...MySQL不同版本sql_mode默认值可能是不同的,因此在数据库升级配合的应用迁移过程中,尤其要注意像only_full_group_by这种校验规则的改变,很可能是个坑。
引言 今天我们来说一个MySQL查询的例子,比如有一个统计需求, 分组后的数据,我们知道只能使用聚合函数进行统计, 那如果要根据分组约定,将一系列的值合并到单个字段显示出来, 应该怎么写呢? ?...SELECT hobbies FROM peoples_hobbies WHERE person_id = 5; 结果很多行数据: shopping fishing coding 那么问题来了,如果需要的输出类似于...或者说MySQL有没有这个能力处理呢? 当然是有的。MySQL贴心地给出了 GROUP_CONCAT 函数,用于使用分隔符连接多行字段的值。...比如说按照 person_id 进行分组,然后第二列输出用户喜好,使用逗号分隔符: SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ') AS all_hobbies...比如对我们的输出字段进行排序后再使用分隔符连接。
使用profile分析SQL执行状态 4. MySQL Sending data导致查询很慢的问题详细分析 5. mysql查询慢Sending data耗时问题 6....多一个字段, 时间翻一倍. 网上还有其他sql语句优化的点, 但是, 我这个语句用不上呀, 这已经是一个最简单的sql语句了 2....possible_keys 指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用 该列完全独立于EXPLAIN输出所示的表的次序。...key_len 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的...) 不损失精确性的情况下,长度越短越好 ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 rows 表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
EXPLAIN返回SELECT语句中使用的每个表的一行信息 。它按照MySQL在处理语句时读取它们的顺序列出输出中的表。...select * from news where id = 1 or id = 2 4.多个单列索引并不是最佳选择 MySQL 只能使用一个索引,会从多个索引中选择一个限制最为严格的索引,因此,为多个列创建单列索引...6.覆盖索引的好处 如果一个索引包含所有需要的查询的字段的值,直接根据索引的查询结果返回数据,而无需读表,能够极大的提高性能。因此,可以定义一个让索引包含的额外的列,即使这个列对于索引而言是无用的。...7.范围查询对多列索引的影响(组合索引) 查询中的某个列有范围查询,则其右边所有列都无法使用索引优化查找。...因此,在数据库设计时,除非有一个很特别的原因使用 NULL 值,不然尽量不要让字段的默认值为 NULL。
2.分类 根据约束数据列的限制, 约束可分为: 单列约束:每个约束只约束一列(字段) 多列约束:每个约束可约束多列数据 根据约束的作用范围,约束可分为: 列级约束:只能作用在一个列上,跟在列的定义后面...默认值约束 默认约束规定了在未提供值时,某一列应采用的默认值。 例如,在录入商品信息,如果不输入上架状态“上架”或“下架”,那么会默认设置状态为“未上架”。...接下来的三个约束是列约束:每个约束都出现在列定义中,因此只能引用正在定义的列。 其中一项约束是明确命名的。 MySQL 为另外两个分别生成一个名称。 最后两个约束是表约束。 其中之一已被明确命名。...MySQL 为另一个生成一个名称。 创建默认值约束 建表时在字段后使用 DEFAULT 添加默认值可创建默认值约束。...例如,在录入商品信息,如果不输入上架状态“上架”或“下架”,那么会默认设置状态为“未上架”。
典型使用场景场景说明示例定时拉取待处理业务数据按固定频率查询符合条件的新增或待处理记录每5分钟查询一次 status = 0 的订单条件过滤后输出根据业务状态、时间范围等条件筛选数据并输出为 XML查询当天创建的客户信息读取后自动更新状态成功提取记录后更新状态位...添加子表过滤条件子表(test_order_item)需要通过 header_id 字段关联到父表(test_order_header)的 id 字段,以确保每个子表记录只属于其对应的父表记录。...,勾选更新复选框,选择列 status,填写值为 1。...}子表按父表 id 查询明细status updateValue="1"MySQL端口查询并处理该行时将状态更新为1输出 XML 示例: 多业务,推荐使用“父表和子表”结构;对于报表类或扁平数据输出,可以使用“联接表”结构。
本期为迪B课堂特刊【MySQL经典案例解析系列】第二期。...这里的数据“大”,远不止存储空间占用多,其中也包括了单个(表)字段存储多、大,数据留存时间长,数据冗余多,冷热数据不明显导致的体量大,访问峰值随着热点变化明显,逻辑处理复杂导致数据存储压力放大等等。...• InnoDB表,NULL和NOT NULL列存储大小是一样 • MyISAM表,NULL列需要额外的空间记录其值是否为NULL。每个NULL需要一个额外的位(四舍五入到最接近的字节)。...由于innodb存储引擎表为索引组织表,树底层的叶子节点为一双向链表,因此每个页中至少应该有两行记录,这就决定了innodb在存储一行数据的时候不能够超过8k,减去其它列值所占字节数,约等于N。...一张表里有很多大字段,建议组合起来单独存到一个列里面。让所有的大字段共享一个扩展存储空间,比每个字段用自己的页要好。 4.
MySQL优化 选取最适用的字段长度 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。...如果要在MySQL中使用外键,一定要记住在创建表的时候将表的类型定义为事务安全表InnoDB类型。该类型不是MySQL表的默认类型。...如果为分组字段或者排序字段建立索引,可以有效地避免排序操作。 为常作为查询条件的字段建立索引 如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。...,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,个人认为尽量不要选用状态\状态字段为索引 尽量使用数据量少的索引 如果索引的值很长,那么查询的速度会受到影响。...例如,对一个CHAR(100)类型的字段进行全文检索需要的时间要比对CHAR(10)类型的字段需要的时间要多。
这里的数据“大”,远不止存储空间占用多,其中也包括了单个(表)字段存储多、大,数据留存时间长,数据冗余多,冷热数据不明显导致的体量大,访问峰值随着热点变化明显,逻辑处理复杂导致数据存储压力放大等等。...,把字段改成text或者blob,不仅增大了数据存储的容量,对这个字段的索引页只能采用前缀或者全文索引了,如果业务侧存储的是json格式的数据,5.7支持json数据类型是个不错的选择,可以针对单个子类进行查询和输出...InnoDB表,NULL和NOT NULL列存储大小是一样 MyISAM表,NULL列需要额外的空间记录其值是否为NULL。每个NULL需要一个额外的位(四舍五入到最接近的字节)。...当行长超过8K的时候,如果是16K的页面,就会强制转换一些字符串类型为TEXT,把字符串主体转移到扩展页中,会导致读取列需要多一个IO,更大的页面也就支持了更大的行长,64K页面可以支持近似32K的行长而不用使用扩展页...③一张表里有很多大字段,最好组合起来单独存到一个列里面。让所有的大字段共享一个扩展存储空间,比每个字段用自己的页要好。
,返回匹配的所有行(0,多) eq_ref:唯一性索引:对于每个索引键的查询,返回匹配唯一行数据(有且只有1个,不能多 、不能0) const:仅仅能查到一条数据的SQL ,用于Primary key...该列完全独立于EXPLAIN输出所示的表的次序。...七、key_len 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的...) 不损失精确性的情况下,长度越短越好 八、ref 列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 九、rows 估算出结果集行数,表示MySQL根据表统计信息及索引选用情况...注意:要尽量避免让type的结果为all,extra的结果为:using filesort 4.适当的位置加上索引【注意以下几种情况】 较频繁的作为查询条件字段应该创建索引 select
# 单线程主从复制时,该表为空,为多线程主从复制时表中记录协调者线程状态信息,多主复制时每个复制通过记录一行信息 admin@localhost : performance_schema 02:49:50...,如果threads表中INSTRUMENTED列值为“yes”则执行收集,否则不收集。...五、按照帐号、主机、用户统计的状态变量统计表 按照帐号、主机名、用户名为分组对状态变量进行分类数据,例如:按照帐号表统计的表分组列为host和user列,聚合列当然就是状态变量本身(该功能是MySQL...如果HOST_VALIDATED为YES,则HOST列被当作与之相关的IP使用,以避免使用DNS解析。...对于主机名(DNS中的主机名),MySQL不会在mysql.user表中重试执行与主机列匹配操作,例如:1.2.example.com(主机名部分是数字是错误的格式)。
做这个系列,源于一个朴素的愿望:把踩过的坑、总结的经验系统化输出,希望能帮到刚入行或想进阶的兄弟们。让我们开始今天的第6天内容。面试考点索引在哪些场景下会失效?如何判断一个字段是否需要建索引?...当选择性很低时(比如性别字段只有男女两个值),MySQL优化器倾向于全表扫描而不是走索引。...,选择性≈2/100000=0.00002,EXPLAIN会显示全表扫描phone字段唯一值多,选择性≈1,会走索引场景二:索引列参与运算导致失效对比索引在有运算和无运算下的执行计划展开代码语言:SQLAI..."字段只有"启用"和"禁用"两种值,应该给状态字段建索引吗?...:状态类字段、长字符串、联合索引最左前缀下期预告:SQL优化工具推荐——面试必问!
1.3 约束的分类 根据约束数据列的限制,约束可分为: 单列约束 每个约束只约束一列 多列约束 每个约束可约束多列数据 根据约束的作用范围,约束可分为 列级约束 只能作用在一个列上,跟在列的定义后面...主键约束对应着表中的一列或者多列(复合主键) 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。...MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。...主键约束对应着表中的一列或者多列(复合主键) 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。...MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引 (能够根据主键查询的,就根据主键查询,效率更高)。
其中 sendingdata 状态表示mysql线程开始访问数据行并把结果返回给客户端,而不仅仅是返回给客户端,由于在sending data状态下,mysql线程往往需要做大量的磁盘读取操作;所以经常是整个查询中最耗时的状态...面试回答数据库优化问题从以下几个层面入手 (1)、根据服务层面:配置mysql性能优化参数; (2)、从系统层面增强mysql的性能:优化数据表结构、字段类型、字段索引、分表,分库、读写分离等等。...,但是不推荐让很多字段都留有大量的冗余,这样既浪费磁盘的存储空间,同时在应用操作时也浪费物理内存mysql,可以使用函数procedure analyse对当前的表进行分析 //输出的每一类信息都对数据表中的列的数据类型提出优化建议...第二语句高数procedure anaylse不要为那些包含的值多余16个或者256个字节的enum类型提出建议,如果没有这个限制,输出的信息可能很长;ENUM定义通常很难阅读,通过输出信息,可以将表中的部分字段修改为效率更高的字段...根据一列或多列数据把数据行放到两个独立的表中:水平拆分会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要UNION操作,缺点:只要索引关键字不大,则在索引查询时,表中增加了2-3倍的数据量
字段)例如一个简单查询:EXPLAIN SELECT * FROM orders WHERE user_id = 100;输出结果类似:id | select_type | table | type...隐式类型转换(MySQL严格模式可规避)-- user_id 为 VARCHAR 类型EXPLAIN SELECT * FROM users WHERE user_id = 100; -- 失效EXPLAIN...undefined通过EXPLAIN的Using index condition识别SET optimizer_switch='index_condition_pushdown=on';PostgreSQL特性:多列统计信息...成为索引设计师优秀的索引设计如同为数据构建高速公路网: 通过EXPLAIN识别瓶颈路段(全表扫描/文件排序) 用复合索引建立立体交通枢纽(ESR规则) 定期维护统计信息保证导航精准 针对数据库特性启用高级功能(ICP/多列统计...) 终极检验:当EXPLAIN输出出现type=ref+Extra=Using index时,标志着你的索引设计达到完美状态——覆盖索引高速直达目的地,无需二次回表查询。
* from tb_sku where sn = '1000000003410008'; 最左前缀法则 如果索引了多列(联合索引),要遵守最左前缀法则。...每个页面包含了2-N行数据(如果一行数据很大,会行益处),根据主键排列 页合并 当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。...==用户自定义变量==是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用“@变量名”使用就可以。其作用域为当前连接。...区,表空间的单元结构,每个区的大小为1M。默认情况下,InnoDB存储引擎页大小为16K,即一个区中一共有64个连续的页。 页,是InnoDB存储引擎磁盘管理的最小单元,每个页的大小默认为16KB。...) information_schema 提供了访问数据库元数据的各种表和视图,包含数据库、表、字段类型及访问权限等 performance_schema 为MySQL服务器运行时状态提供了一个底层监控功能
根据粒度,可以分为表锁、页锁、行锁。 什么是间隙锁? 答案:间隙锁是可重复读级别下才会有的锁,mysql会帮我们生成了若干左开右闭的区间,结合MVCC和间隙锁可以解决幻读问题。 如何避免死锁?...唯一索引:索引列的值必须唯一,但允许有空值 复合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并 聚簇索引:也称为主键索引,是一种数据存储方式。...3、建立联合索引,由于联合索引的每个叶子节点包含检索字段的信息,按最左前缀原则匹配后,再按其它条件过滤,减少回表的数据量。 4、还可以使用虚拟列和联合索引来提升复杂查询的执行效率。...时间复杂度为O(n),当表的数据量上千万时,树的深度很深,mysql读取时消耗大量 IO。另外,InnoDB引擎采用页为单位读取,每个节点一页,但是二叉树每个节点储存一个关键词,导致空间浪费。...答案:通过 show slave status 命令输出的Seconds_Behind_Master参数的值来判断 为零:表示主从复制良好 正值:表示主从已经出现延时,数字越大,表示从库延迟越严重 主从延迟要怎么解决
5)command列,显示当前连接的执行的命令,一般取值为休眠(sleep),查询(query),连接(connect)等 6)time列,显示这个状态持续的时间,单位是秒 7)state列,显示使用当前连接的...sql语句的状态,很重要的列。...通过show profile for query query_id 语句可以查看到该SQL执行过程中每个线程的状态和消耗的时间 : ?...2).最左前缀法则 如果索引多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始,并且不能跳过创建复合索引中的中间列。...完成排序之后,再根据行指针回表读取记录,该操作可能会导致大量随机I/O操作。 2)一次扫描算法 :一次性取出满足条件的所有字段,然后在排序区sort buffer中排序后直接输出结果集。
EXPLAIN输出的字段解析 执行EXPLAIN语句后,输出结果中的字段提供了关于查询执行计划的详细信息。以下是一些常见的输出字段及其含义: id 查询的唯一标识符。...分区是MySQL中一种对表进行水平分割的技术,可以根据某个列的值将表数据划分为不同的分区。 分区名称 如果查询涉及分区表,并且分区列上有索引,partitions字段将显示查询中涉及的分区的名称。...多个索引 如果查询中有多个可以使用的索引,它们将以逗号分隔列在possible_keys字段中。 NULL值 如果possible_keys字段的值为NULL,表示在查询中没有找到可以使用的索引。...多列索引的情况 如果使用的是多列索引,key_len将显示这些列长度之和。例如,如果有一个包含两个INT类型列的索引,且这两列的长度分别为4个字节,那么key_len将显示8。...这个字段可以包含多个标志,每个标志之间以分号(;)分隔。 Using where 表示MySQL将在存储引擎层使用WHERE条件来过滤行。这意味着在检索出的结果集中,可能会有额外的条件过滤。