首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

go-sql-driver源码分析

允许使用不可靠的旧密码 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 ,如果有设置别名则赋值别名...

1.4K00

程序猿必备技能之MySQL高级篇

存储引擎是MySql具体的与文件打交道的子系统。 File System: 文件系统,数据、日志(redo,undo)、索引错误日志、查询记录、慢查询等。...存储引擎 CSV: 以逗号隔开的数据存储格式文件,它不支持索引,一般常用于数据交互格式,数据导出、导入。 ARCHIVE: 采用压缩协议进行数据的存储,数据存储以ARZ格式存储。...32)=char(32); 不支持大数据存储类型字段如 blog,text表级锁; 常用于等值查找热度较高数据、内存数据查询计算,查询的临时表就是使用当前引擎。...MyISAM的索引与行记录是分开存储的,分别以.MYI和.MYD,使用的索引叫做非聚集索引; 支持表级锁,不支持行锁,不支持事务; select count(*) from tableName无需进行数据的扫描...key显示使用了哪个索引一般就是在你的where语句中出现了between、、in等的查询 这种范围扫描索引扫描比全表扫描要好,因为他只需要开始索引的某一点,而结束语另一点,不用扫描全部索引

1.2K31
您找到你想要的搜索结果了吗?
是的
没有找到

13000字!最常问的MySQL面试题集合

随机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

85630

MySQL性能优化(七):MySQL执行计划,真的很重要,来一起学习吧

select_type 查询类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询。 table 表明对应行正在访问的是哪个表。 partitions 查询涉及的分区。...3. table table列表示对应行正在执行的哪张表,指代对应表,或者该表的别名(如果SQL定义了别名)。 4. partitions 查询涉及的分区。...7. key 实际使用的索引,如果为NULL,则没有使用索引。查询如果使用了覆盖索引,则该索引出现在key。...表film_actoractor_id为1的记录有19条,而SQL查询时扫描19行(rows:19),19条符合条件(filtered: 100 19/19) 12....2)Using where 许多where条件里是涉及索引,当它读取索引时,就能被存储引擎检验,因此不是所有带·where子句的查询都会显示“Using where”。

5.3K71

mysql之引擎、Explain、权限详解

但是该引擎不支持FULLTEXT类型索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。...五、possible_keys 指出MySQL能使用哪个索引在表中找到记录,查询涉及的字段若存在索引,则该索引将被列出,但不一定被查询使用 该完全独立于EXPLAIN输出所示的表的次序。...这意味着在possible_keys的某些键实际不能按生成的表次序使用。 如果该是NULL,则没有相关的索引。...,表示mysql服务器将在存储引擎检索行后再进行过滤 Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询 Using filesort:MySQL无法利用索引完成的排序操作称为...* 数据库的所有 数据库.表 指定数据库的某张表 数据库.存储过程 指定数据库存储过程

1.1K40

MySQL Slow Sql优化(面向研发)

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)避免建立冗余和重复索引,(有联合索引,就不用建立最左的独立索引

1.8K31

面试必备(背)--MySQL 八股文系列!

等数据类型创建全文索引。...最适合创建索引出现在 WHERE 或 ON 子句中的,或连接子句中的而不是出现在SELECT关键字后的。 对于字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间。...索引的基数越大、索引的区分度越高,索引的效果越好。 尽量使用短索引,因为较小的索引涉及的磁盘I/O较少,并且索引高速缓存的块可以容纳更多的键值,会使得查询速度更快。 尽量利用最左前缀。...不要在索引上做任何操作(计算、函数、自动/手动类型转换),不然会导致索引失效而转向全表扫描。 不能继续使用索引范围条件(bettween、、in等)右边的索引字段使用(!...= 或者 )判断时,会导致索引失效而转向全表扫描索引字段使用 is null / is not null 判断时,会导致索引失效而转向全表扫描

5.3K12

数据库之MySql建议收藏

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数据类型

88310

看了这篇MySQL,开发功力又升级

(错误日志) 默认是关闭的,通常用于记录数据库服务端启动、重启、主从复制时,记录错误日志详情保留在文件,方便DBA、运维开发人员阅读。...= 1 重启服务器(重启前要将原来的数据库和表转换为小写,否则更改后找不到数据库sql_mode sql_mode 是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的...CSV引擎: CSV引擎可以普通的CSV文件作为MySQL的表来处理,但不支持索引。可以作为一种数据交换的机制,非常有用。存储的数据直接可以在操作系统里,用文本编辑器,或者excel读取。...常见于主键或唯一索引扫描 ref 非唯一性索引扫描,返回匹配某个单独值的所有行,本质也是一种索引访问,它返回所有匹配某个单独值的行,然而,他可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体...查询涉及的字段若存在的索引,则该索引将被列出,但不一定被查询实际使用 6.【key】 实际使用的索引,如果为NULL,则没有使用索引

55930

SQL性能优化的47个小技巧,果断收藏!

客户端发送一条查询语句服务器; 服务器先查询缓存,如果命中缓存,则立即返回存储在缓存的数据; 未命中缓存后,MySQL通过关键字SQL语句进行解析,并生成一颗对应的解析树,MySQL解析器将使用...; 数据库对象的命名要能做到见识意,并且最后不要超过32个字符; 临时库表必须以tmp_为前缀并以日期为后缀,备份表必须以bak_为前缀并以日期(时间戳)为后缀; 所有存储相同数据的列名和类型必须一致...43、禁止在表建立预留字段 预留字段的命名很难做到见识义; 预留字段无法确认存储的数据类型,所以无法选择合适的类型; 对预留字段类型的修改,会对表进行锁定; 44、禁止在数据库存储图片...45、建议把BLOB或是TEXT分离单独的扩展表 Mysql内存临时表不支持TEXT、BLOB这样的大数据类型,如果查询包含这样的数据,在排序等操作时,就不能使用内存临时表,必须使用磁盘临时表进行...如果一定要使用,建议把BLOB或是TEXT分离单独的扩展表,查询时一定不要使用select * 而只需要取出必要的,不需要TEXT的数据时不要对该进行查询。

25222

MySQL性能优化总结

11,应尽可能的避免更新 clustered 索引数据, 因为 clustered 索引数据的顺序就是表记录的物理存储顺序,一旦该值改变导致整个表记录的顺序的调整,会耗费相当大的资源。...22,在IN后面值的列表,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。 23,尽量数据的处理工作放在服务器,减少网络的开销,如使用存储过程。...存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库SQL语句,是控制流语言的集合,速度当然快。反复执行的动态SQL,可以使用临时存储过程,该过程(临时表)被放在Tempdb。...GROUP BY和ORDER BY子句中使用有索引,保持索引简单,不在多个索引包含同一个,有时候MySQL会使用错误索引,对于这种情况使用USE INDEX,检查使用SQL_MODE=STRICT...16.应尽可能的避免更新 clustered 索引数据,因为 clustered 索引数据的顺序就是表记录的物理存储顺序,一旦该值改变导致整个表记录的顺序的调整,会耗费相当大的资源。

63110

DBA-MySql面试问题及答案-

文件都和表名相同,扩展名分别是 .frm (存储表定义) 、.MYD (MYData,存储数据)、.MYI (MYIndex,存储索引)。...InnoDB 存储引擎和数据 建议使用 VARCHAR类型 对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度(所有数据行 都使用指向数据值的头指针) ,因此在本质,使用固定长度的...最适合索引出现在WHERE子句中的,或连接子句中指定的,而不是出现在SELECT 关键字后的选择列表。 使用惟一索引。考虑某中值的分布。...唯一键冲突 事务回滚 批量申请自增id的策略 18.sql注入问题? 原因:用户传入的参数中注入符合sql的语法,从而破坏原有sql结构语意,达到攻击效果。 19.什么是3NF(范式)?...其他数据库也叫做唯一索引扫描 3、eq_ref 多表join时,对于来自前面表的每一行,在当前表只能找到一行。这可能是除了system和const之外最好的类型

27120

MySQL进阶之索引【分类,性能分析,使用,设计原则】

3.4 Hash 哈希索引就是采用一定的hash算法,键值换算成新的hash值,映射到对应的槽位,然后存储在 hash表。  ...如果两个(或多个)键值,映射到一个相同的槽位,他们就产生了hash冲突(也称为hash碰撞),可 以通过链表来解决。...注: 联合索引出现范围查询(>,<),范围查询右侧的索引失效。 在业务允许的情况下,尽可能的使用类似于 >= 或 或 < 。...6.3 索引失效情况 6.3.1 索引运算 不要在索引列上进行运算操作, 索引失效。 就例如在t_user表索引是age,如果在age用AVG函数做平均值进行运算操作后,索引失效。...如果由于查询返回的数据是*,所以此时,还需要根据主键值,聚集索引查找主键值对应的记录,最终找到 主键值 对应的行row。 这就需要两次索引扫描,也就是需要回表查询,性能相对较差一点。

34210

Mysql学习笔记,持续记录

主键置于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.2K50

Oracle面试题

索引使用原则: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无法使用该索引

1.6K00

Java面经——数据库

FLOAT类型数据可以存储至多8位十进制数,并在内存占4字节。 DOUBLE类型数据可以存储至多18位十进制数,并在内存占8字节。 4.varchar和text的区别是什么?...不是,视图只是查询的复杂SQL语句进行记录,方便后续使用,使用时用视图可直接替代复杂的SQL语句,不会开辟空间存储表结果。...19.mysql中有哪些索引?...根据慢日志定位查询Sql(超出设定执行时间的sql语句会被记录到慢日志) 使用explain分析Sql(type字段为index或者all时表示是全表扫描,建议优化) 修改Sql,尝试使用索引优化查询...不支持复杂查询 33.SQL语句优化 应尽量避免在 where 子句中使用!=或操作符,否则将引擎放弃使用索引而进行全表扫描

1.3K60

企业面试题|最常问的MySQL面试题集合(一)

随机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语句,Bage>50的记录的c1,c2更新到A表同一记录

66832

MySQL学习笔记(长期更新)

,原因是MySQL采用二进制存储数据,如果尾数不是0或5,就需要使用四舍五入的方式来表达,定点数类型:DECIMAL(十进制数的整数部分和小数部分拆开,分别转换成十六进制数存储)。...外键(FOREIGN KEY)和连接(JOIN)多张表关联。 设计外键 有两张表A、B通过id进行关联,如果Id在A时主键,那么A便称为主表,B表就是从表,B表的id字段就是外键。...,正在被从表某条记录的外键字段所引用,MySQL会提示错误,从而保证关联数据不会丢失。...语句中的错误,所以如果事务的某SQL执行出现错误后提交会出现事务不一致的问题,如mytrans在插入时出现错误,inventory表执行成功,库存字段数据-5,这样会导致数据不一致的问题。...19-日志():系统出现问题,如何及时发现? 通用查询日志 通用查询日志记录了所有用户的连接开始时间和截至时间,以及发给MySQL数据库服务器的所有SQL指令。

93710

MySQL 直方图介绍

4、单列唯一索引、主键索引不支持创建直方图,创建的时候会提示Error,并输出错误提示The column 'id' is covered by a single-part unique index....直方图采集的基本单位是表数据,也就是当数据或类型发生变更或删除的时候直方图可能也会出现相应变化,经过测试有如下情况: 1、当表被删除的时候,直方图会同步被删除,truncte操作不会有影响,同理...各个年龄段的人数;当前t_userage字段没有建立索引。...通过分析,可以看出执行过程type=ALL走了全表扫描,filtered=11.11 过滤比例还是比较低的,同时表没有建立索引,所以key=NuLL。...五、总结 本文对直方图的内容进行简单的介绍,篇幅所限,更多细节内容请移步官网进行查看,另外关于已经有索引的情况下,优化器会如何选择执行计划,篇幅所限,以后再进行测试。

53140

Oracle SQL调优系列之优化器基础知识

,也可以并行执行 索引扫描会按照叶子块排序返回,而索引快速全扫描则是按照索引段内存储块顺序返回 索引快速全扫描的执行结果不一定是有序的,而索引扫描的执行结果是有序的,因为索引快速全扫描是根据索引行在磁盘的物理存储顺序来扫描的...索引跳跃式扫描(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

80120
领券