允许使用不可靠的旧密码 ClientFoundRows bool // 返回匹配的行数而不是受影响的行数 ColumnsWithAlias bool // 将表名前置在列名...return mc.readResultOK() } mc.readPacket() // 如果中途出错,将错误信息读取到 mysqlConn 中,并返回该错误...Protocol Basics 基础数据类型 MySQL 通信的基本数据类型有两种, Integer 、 String Integer : 分别有 1, 2, 3, 4, 8 个字节长度的类型,使用小端传输...lastcols []driver.Value } 我们跳过 database/sql 包中的 Rows 实现,其无非是提供了更多功能的一个结果集而已,让我们回到真正与数据库进行交互的 Rows 中进行源码分析...columns := make([]string, len(rows.columns)) // 将列名赋值到 columns ,如果有设置别名则赋值别名...
存储引擎是MySql中具体的与文件打交道的子系统。 File System: 文件系统,数据、日志(redo,undo)、索引、错误日志、查询记录、慢查询等。...存储引擎 CSV: 以逗号隔开的数据存储格式文件,它不支持索引,一般常用于数据交互格式,数据导出、导入。 ARCHIVE: 采用压缩协议进行数据的存储,数据存储以ARZ格式存储。...32)=char(32); 不支持大数据存储类型字段如 blog,text表级锁; 常用于等值查找热度较高数据、内存数据查询计算,查询中的临时表就是使用当前引擎。...MyISAM的索引与行记录是分开存储的,分别以.MYI和.MYD,使用的索引叫做非聚集索引; 支持表级锁,不支持行锁,不支持事务; select count(*) from tableName无需进行数据的扫描...key列显示使用了哪个索引一般就是在你的where语句中出现了between、、in等的查询 这种范围扫描索引扫描比全表扫描要好,因为他只需要开始索引的某一点,而结束语另一点,不用扫描全部索引。
将随机I/O变顺序I/O。 大大提高查询速度。 降低写的速度(不良影响)。 磁盘占用(不良影响)。 索引的使用场景: 对于非常小的表,大部分情况下全表扫描效率更高。 中到大型表,索引非常有效。...全文索引:MySQL自带的全文索引只能用于MyISAM,并且只能对英文进行全文检索 (基本不用) MySQL索引的创建原则 最适合创建索引的列是出现在WHERE或ON子句中的列,或连接子句中的列而不是出现在...问题19:以下三条sql 如何建索引,只建一条怎么建?...优化查询过程中的数据访问 访问数据太多导致查询性能下降 确定应用程序是否在检索大量超过需要的数据,可能是太多行或列 确认MySQL服务器是否在分析大量不必要的数据行 避免犯如下SQL语句错误 查询不需要的数据...如下面语句将进行全表扫描: select id from t where num=@num可以改为强制查询使用索引:select id from t with(index(索引名)) where num
select_type 查询类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询。 table 表明对应行正在访问的是哪个表。 partitions 查询涉及到的分区。...3. table列 table列表示对应行正在执行的哪张表,指代对应表名,或者该表的别名(如果SQL中定义了别名)。 4. partitions列 查询涉及到的分区。...7. key列 实际使用的索引,如果为NULL,则没有使用索引。查询中如果使用了覆盖索引,则该索引仅出现在key列中。...表film_actor中actor_id为1的记录有19条,而SQL查询时扫描了19行(rows:19),19条符合条件(filtered: 100 19/19) 12....2)Using where 许多where条件里是涉及索引中的列,当它读取索引时,就能被存储引擎检验,因此不是所有带·where子句的查询都会显示“Using where”。
但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。...五、possible_keys 指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用 该列完全独立于EXPLAIN输出所示的表的次序。...这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。 如果该列是NULL,则没有相关的索引。...,表示mysql服务器将在存储引擎检索行后再进行过滤 Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询 Using filesort:MySQL中无法利用索引完成的排序操作称为...* 数据库中的所有 数据库名.表 指定数据库中的某张表 数据库名.存储过程 指定数据库中的存储过程
Tables:查询中涉及到的表 Explain:SQL语句 四、SQL优化利器—explain使用 explain模拟优化器执行SQL语句,在5.6以及以后的版本中,除过select,其他比如insert...7)rows:扫描行的数量 8)Extra:执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息。...,减少间隙锁产生,高发下避免死锁 5)禁止给表中的每一列都建立单独的索引 6)限制每张表上的索引数量,建议单张表索引不超过5个 7)出现在SELECT、UPDATE、DELETE语句的WHERE条件的列...,和包含在ORDER BY、GROUP BY、DISTINCT中的列,通常建立联合索引效果更好 8)区分度最高的放在联合索引的最左侧(区分度=列中不同值的数量/列的总行数) 9)尽量把字段长度小的列放在联合索引的最左侧...(因为字段长度越小,一页能存储的数据量越大,IO性能也就越好) 10)使用最频繁的列放到联合索引的左侧(这样可以比较少的建立一些索引) 11)避免建立冗余和重复索引,(有联合索引,就不用建立最左列的独立索引
等数据类型上创建全文索引。...最适合创建索引的列是出现在 WHERE 或 ON 子句中的列,或连接子句中的列而不是出现在SELECT关键字后的列。 对于字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间。...索引列的基数越大、索引列的区分度越高,索引的效果越好。 尽量使用短索引,因为较小的索引涉及到的磁盘I/O较少,并且索引高速缓存中的块可以容纳更多的键值,会使得查询速度更快。 尽量利用最左前缀。...不要在索引上做任何操作(计算、函数、自动/手动类型转换),不然会导致索引失效而转向全表扫描。 不能继续使用索引中范围条件(bettween、、in等)右边的列 。 索引字段上使用(!...= 或者 )判断时,会导致索引失效而转向全表扫描。 索引字段上使用 is null / is not null 判断时,会导致索引失效而转向全表扫描。
MERGE ---- MERGE表是将具有相似结构的多个MyISAM表组合到一个表中的虚拟表。MERGE存储引擎也被称为MRG_MyISAM引擎。 MERGE表没有自己的索引; 它会使用组件表的索。...如果在MERGE表上使用DROP TABLE语句,则仅删除MERGE规范。基础表不会受到影响。 Memory ---- 内存表存储在内存中,并使用散列索引,使其比MyISAM表格快。...内存存储引擎以前称为HEAP。 Archive ---- 归档存储引擎允许将大量用于归档目的的记录存储为压缩格式以节省磁盘空间。...归档存储引擎在插入时压缩记录,并在读取时使用zlib库对其进行解压缩。 归档表只允许INSERT和SELECT语句。 ARCHIVE表不支持索引,因此需要完整的表扫描来读取行。...CSV ---- CSV存储引擎以逗号分隔值(CSV)文件格式存储数据。 CSV表格提供了将数据迁移到非SQL应用程序(如电子表格软件)中的便捷方式。 CSV表不支持NULL数据类型。
(错误日志) 默认是关闭的,通常用于记录数据库服务端启动、重启、主从复制时,记录错误,将日志详情保留在文件中,方便DBA、运维开发人员阅读。...= 1 重启服务器(重启前要将原来的数据库和表转换为小写,否则更改后将找不到数据库名) sql_mode sql_mode 是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的...CSV引擎: CSV引擎可以将普通的CSV文件作为MySQL的表来处理,但不支持索引。可以作为一种数据交换的机制,非常有用。存储的数据直接可以在操作系统里,用文本编辑器,或者excel读取。...常见于主键或唯一索引扫描 ref 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,他可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体...查询涉及到的字段上若存在的索引,则该索引将被列出,但不一定被查询实际使用 6.【key】 实际使用的索引,如果为NULL,则没有使用索引。
客户端发送一条查询语句到服务器; 服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中的数据; 未命中缓存后,MySQL通过关键字将SQL语句进行解析,并生成一颗对应的解析树,MySQL解析器将使用...; 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符; 临时库表必须以tmp_为前缀并以日期为后缀,备份表必须以bak_为前缀并以日期(时间戳)为后缀; 所有存储相同数据的列名和列类型必须一致...43、禁止在表中建立预留字段 预留字段的命名很难做到见名识义; 预留字段无法确认存储的数据类型,所以无法选择合适的类型; 对预留字段类型的修改,会对表进行锁定; 44、禁止在数据库中存储图片...45、建议把BLOB或是TEXT列分离到单独的扩展表中 Mysql内存临时表不支持TEXT、BLOB这样的大数据类型,如果查询中包含这样的数据,在排序等操作时,就不能使用内存临时表,必须使用磁盘临时表进行...如果一定要使用,建议把BLOB或是TEXT列分离到单独的扩展表中,查询时一定不要使用select * 而只需要取出必要的列,不需要TEXT列的数据时不要对该列进行查询。
11,应尽可能的避免更新 clustered 索引数据列, 因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。...22,在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。 23,尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。...存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句,是控制流语言的集合,速度当然快。反复执行的动态SQL,可以使用临时存储过程,该过程(临时表)被放在Tempdb中。...GROUP BY和ORDER BY子句中使用有索引的列,保持索引简单,不在多个索引中包含同一个列,有时候MySQL会使用错误的索引,对于这种情况使用USE INDEX,检查使用SQL_MODE=STRICT...16.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。
文件名都和表名相同,扩展名分别是 .frm (存储表定义) 、.MYD (MYData,存储数据)、.MYI (MYIndex,存储索引)。...InnoDB 存储引擎和数据列 建议使用 VARCHAR类型 对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行 都使用指向数据列值的头指针) ,因此在本质上,使用固定长度的...最适合索引的列是出现在WHERE子句中的列,或连接子句中指定的列,而不是出现在SELECT 关键字后的选择列表中的列。 使用惟一索引。考虑某列中值的分布。...唯一键冲突 事务回滚 批量申请自增id的策略 18.sql注入问题? 原因:用户传入的参数中注入符合sql的语法,从而破坏原有sql结构语意,达到攻击效果。 19.什么是3NF(范式)?...其他数据库也叫做唯一索引扫描 3、eq_ref 多表join时,对于来自前面表的每一行,在当前表中只能找到一行。这可能是除了system和const之外最好的类型。
3.4 Hash 哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在 hash表中。 ...如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可 以通过链表来解决。...注: 联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效。 在业务允许的情况下,尽可能的使用类似于 >= 或 或 < 。...6.3 索引失效情况 6.3.1 索引列运算 不要在索引列上进行运算操作, 索引将失效。 就例如在t_user表上,索引列是age,如果在age用AVG函数做平均值进行运算操作后,索引失效。...如果由于查询返回的数据是*,所以此时,还需要根据主键值,到聚集索引中查找主键值对应的记录,最终找到 主键值 对应的行row。 这就需要两次索引扫描,也就是需要回表查询,性能相对较差一点。
如将主键置于where列表中,MySQL就能将该查询转换为一个常量。 eq_ref 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。...range 只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引,一般就是在你的where语句中出现between、、in等的查询,这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点...possible_keys possible_keys 显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。...如果是id 为varchar类型,此时传入 int类型的1这个时候索引就会失效,走全表扫描。 like 条件中出现”%“开头的左模糊查询。...,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,因为列不在GROUP BY从句中 STRICT_TRANS_TABLES:严格模式,在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作
索引使用原则:1.索引字段建议建立NOT NULL约束2.经常与其他表进行连接的表,在连接字段上应该建立索引;3.经常出现在Where子句中的字段且过滤性很强的,特别是大表的字段,应该建立索引;4.如果有两个或者以上的索引...申请时必须要定义返回类型,且程序体中必须定义 return 语句(3)最多返回一个值(4)不能独立执行,必须作为表达式的一部分调用注意:sql数据操纵语句中只能调用函数而不能调用存储过程12.什么是锁、...(15)用UNION替换OR(适用于索引列):用UNION替换WHERE子句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫描。...(17)避免改变索引列的类型:当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换(18)使用表的别名:当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每个列上。...这样一来,就可以减少解析的时间并减少那些由列歧义引起的语法错误。(19)避免在索引列上使用 IS NULL和IS NOT NULL避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 。
FLOAT类型数据可以存储至多8位十进制数,并在内存中占4字节。 DOUBLE类型数据可以存储至多18位十进制数,并在内存中占8字节。 4.varchar和text的区别是什么?...不是,视图只是将查询的复杂SQL语句进行记录,方便后续使用,使用时用视图可直接替代复杂的SQL语句,不会开辟空间存储表结果。...19.mysql中有哪些索引?...根据慢日志定位查询Sql(超出设定执行时间的sql语句会被记录到慢日志中) 使用explain分析Sql(type字段为index或者all时表示是全表扫描,建议优化) 修改Sql,尝试使用索引优化查询...不支持复杂查询 33.SQL语句优化 应尽量避免在 where 子句中使用!=或操作符,否则将引擎放弃使用索引而进行全表扫描。
将随机I/O变顺序I/O。 大大提高查询速度。 降低写的速度(不良影响)。 磁盘占用(不良影响)。 索引的使用场景: 对于非常小的表,大部分情况下全表扫描效率更高。 中到大型表,索引非常有效。...全文索引:MySQL自带的全文索引只能用于MyISAM,并且只能对英文进行全文检索 (基本不用) MySQL索引的创建原则 最适合创建索引的列是出现在WHERE或ON子句中的列,或连接子句中的列而不是出现在...4、如果MySQL估计使用索引比全表扫描更慢,会放弃使用索引,例如: 表中只有100条数据左右。对于SQL语句WHERE id > 1 AND id < 100,MySQL会优先考虑全表扫描。...6、列类型是字符串,查询时一定要给值加引号,否则索引失效,例如: 列name varchar(16),存储了字符串"100" WHERE name = 100; 以上SQL语句能搜到,但无法用到索引。...问题19:有A(id,sex,par,c1,c2),B(id,age,c1,c2)两张表,其中A.id与B.id关联,现在要求写出一条SQL语句,将B中age>50的记录的c1,c2更新到A表中同一记录中的
,原因是MySQL采用二进制存储数据,如果尾数不是0或5,就需要使用四舍五入的方式来表达,定点数类型:DECIMAL(将十进制数的整数部分和小数部分拆开,分别转换成十六进制数存储)。...外键(FOREIGN KEY)和连接(JOIN)将多张表关联。 设计外键 有两张表A、B通过id进行关联,如果Id在A中时主键,那么A便称为主表,B表就是从表,B表中的id字段就是外键。...,正在被从表中某条记录的外键字段所引用,MySQL会提示错误,从而保证关联数据不会丢失。...语句中的错误,所以如果事务中的某SQL执行出现错误后提交会出现事务不一致的问题,如mytrans在插入时出现错误,inventory表执行成功,库存字段数据-5,这样会导致数据不一致的问题。...19-日志(上):系统出现问题,如何及时发现? 通用查询日志 通用查询日志记录了所有用户的连接开始时间和截至时间,以及发给MySQL数据库服务器的所有SQL指令。
4、单列唯一索引、主键索引不支持创建直方图,创建的时候会提示Error,并输出错误提示The column 'id' is covered by a single-part unique index....直方图采集的基本单位是表中的列数据,也就是当列数据或类型发生变更或删除的时候直方图可能也会出现相应变化,经过测试有如下情况: 1、当表被删除的时候,直方图会同步被删除,truncte操作不会有影响,同理...各个年龄段的人数;当前t_user上age字段没有建立索引。...通过分析,可以看出执行过程type=ALL走了全表扫描,filtered=11.11 过滤比例还是比较低的,同时表上没有建立索引,所以key=NuLL。...五、总结 本文对直方图的内容进行简单的介绍,篇幅所限,更多细节内容请移步官网进行查看,另外关于列中已经有索引的情况下,优化器会如何选择执行计划,篇幅所限,以后再进行测试。
,也可以并行执行 索引全扫描会按照叶子块排序返回,而索引快速全扫描则是按照索引段内存储块顺序返回 索引快速全扫描的执行结果不一定是有序的,而索引全扫描的执行结果是有序的,因为索引快速全扫描是根据索引行在磁盘的物理存储顺序来扫描的...索引跳跃式扫描(INDEX SKIP SCAN)适用于所有类型的***复合B树索引***(包括唯一性索引和非唯一性索引),索引跳跃式扫描可以使那些在where条件中没有目标索引的前导列指定查询条件但是有索引的非前导列指定查询条件的目标...表名 where 列名1 = 条件1 假如改目标SQL符合索引跳跃式扫描的条件,即使,只有列名1这个前导列,还是可以走索引跳跃式扫描的,这个就是跳跃式扫描,不需要如下sql,全部索引列都定位到 select...* from 表名 where 列名1 = 条件1 and 列名2 = 条件2 当然索引跳跃式扫描并不是说适用所有情况,不加前导列,有时候是不走跳跃式扫描的,Oracle中的索引跳跃式扫描仅仅适用于那些目标索引前导列的...,方法也是来自《基于Oracle的SQL优化一书》,作者提供了改写等价sql的方法,比如在sql的where条件中对number或者date类型的列加0, select * from 表格 where
领取专属 10元无门槛券
手把手带您无忧上云