精华内容
下载资源
问答
  • 语句应该考虑哪些安全性?1.防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量。2.最小权限原则,特别是不要用root账户,为不同的类型的动作或者组建使用不同的账户。3.当sql运行出错时,不要...

    语句应该考虑哪些安全性?

    1.防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量。

    2.最小权限原则,特别是不要用root账户,为不同的类型的动作或者组建使用不同的账户。

    3.当sql运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄漏服务器和数据库相关信息。

    2.简单描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响。

    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

    普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。

    普通索引允许被索引的数据列包含重复的值,如果能确定某个数据列只包含彼此各不相同的值,在为这个数据索引创建索引的时候就应该用关键字UNIQE把它定义为一个唯一所以,唯一索引可以保证数据记录的唯一性。

    主键,一种特殊的唯一索引,在一张表中只能定义一个主键索引,逐渐用于唯一标识一条记录,是用关键字PRIMARY KEY来创建。

    索引可以覆盖多个数据列,如像INDEX索引,这就是联合索引。

    索引可以极大的提高数据的查询速度,但是会降低插入删除更新表的速度,因为在执行这些写操作时,还要操作索引文件。

    3.一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 ?

    如果表的类型是MyISAM,那么是18。

    因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失。

    如果表的类型是InnoDB,那么是15。

    InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失。

    4.请简述项目中优化sql语句执行效率的方法,从哪些方面。sql语句性能如何分析?

    1.尽量选择较小的列

    2.将where中用的比较频繁的字段建立索引

    http://www.ahsrst.cn子句中避免使用‘*’

    4.避免在索引列上使用计算,not,in和<>等操作

    5.当只需要一行数据的时候使用limit 1

    6.保证表单数据不超过200w,适时分割表

    针对查询较慢的语句,可以使用explain来分析该语句具体的执行情况

    http://www.ahsrst.cn()和mysql_fetch_array()的区别

    这两个函数,返回的都是一个数组,区别就是第一个函数返回的数组是只包含值,我们只能$row[0],$row[1],这样以数组下标来读取数据,而mysql_fetch_array()返回的数组既包含第一种,也包含键值对的形式,我们可以这样读取数据,(假如数据库的字段是 username,passwd):$row['username'], $row['passwd']。

    常见mysql数据库面试问题2017-04-28 18:32 | #2楼

    1,mysql的复制原理以及流程。

    (1)先问基本原理流程,3个线程以及之间的关联。

    (2)再问一致性延时性,数据恢复。

    (3)再问各种工作遇到的复制bug的解决方法

    2,mysql中myisam与innodb的区别,至少5点。

    (1) 问5点不同

    (2) 问各种不同mysql版本的2者的改进

    (3)2者的索引的实现方式

    3,问mysql中varchar与char的区别以及varchar(50)中的30代表的涵义。

    (1)varchar与char的区别

    (2)varchar(50)中50的涵义

    (3)int(20)中20的涵义

    (4)为什么MySQL这样设计?

    [备注] 本人也面试了近12个2年mysql dba经验的朋友,很少能回答出第(2)以及(4)题。

    4,问了innodb的事务与日志的实现方式。

    (1)有多少种日志

    (2)日志的存放形式

    (3)事务是如何通过日志来实现的,说得越深入越好。

    5,问了mysql binlog的几种日志录入格式以及区别

    (1)各种日志格式的涵义

    (2)适用场景

    (3)结合第一个问题,每一种日志格式在复制中的优劣。

    6,问了下mysql数据库cpu飙升到500%的话他怎么处理?

    (1) 没有经验的,可以不问

    (2)有经验的,问他们的处理思路

    7,sql优化。

    (1)explain出来的各种item的意义

    (2)profile的意义以及使用场景。

    (3)explain中的索引问题。

    8,  备份计划,mysqldump以及xtranbackup的实现原理,

    (1) 备份计划

    (2)备份恢复时间

    (3)备份恢复失败如何处理

    9,  500台db,在最快时间之内重启。

    10, 在当前的工作中,你碰到到的最大的mysql db问题是?

    11,  innodb的读写参数优化

    (1)读取参数,global buffer pool以及 local buffer

    (2)写入参数

    (3)与IO相关的参数

    (4)缓存参数以及缓存的适用场景

    12 ,请简洁地描述下MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?

    13,表中有大字段X(例如:text类型),且字段X不会经常更新,以读为为主,请问

    (1)您 是选择拆成子表,还是继续放一起?

    (2)写出您这样选择的理由?

    14,MySQL中InnoDB引擎的行锁是通过加在什么上完成(或称实现)的?为什么是这样子的?

    展开全文
  • 如果在一个类中定义了多个同名的方法,它们或不同的参数个数或不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 18、error和exception什么区别?  error 表示恢复...
  • 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 可以做的事情: ...关键信息:id、select_ type、table、ty...

    使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。

    可以做的事情: 

    1. 表的读取顺序

    2. 数据读取操作的操作类型

    3. 哪些索引可以使用

    4. 哪些索引被实际使用

    5. 表之间的引用

    6. 每张表有多少行被优化器查询

    语法:EXPLAIN + SQL,如 EXPLAIN select * from article;

    关键信息:id、select_ type、table、type、possible_ keys、key、key_ len、ref、rows、Extra

    目录

    id:

    select_ type:

    TYPE:

    possible_ keys、key、Key_len:

    ref:

    rows:

    Extra:


    id:

    select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。

    三种情况:

    1. id相同,执行顺序由上至下,
    2. id不同,如果是子查询,id的序号会递增,id值 越大优先级越高,越先被执行
    3. id相同不同,同时存在

    select_ type

    查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。

    值:

    1. SIMPLE:简单的select查询,查询中不包含子查询或者UNION
    2. PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为
    3. SUBQUERY:在SELECT或WHERE列表中包含了子查询
    4. DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表里。
    5. UNION:若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT将被标记为: DERIVED
    6. UNION RESULT:从UNION表获取结果的SELECT

    TYPE

    访问类型排列,显示查询使用了何种类型,
    从最好到最差依次是:system>const>eq_ ref>ref>range>index>ALL

    1. ALL:全表扫描,意味着你的sql语句处于一种最原生的状态,有很大的优化空间。
    2. index:另外一种形式的全表扫描,加了索引。
    3. range:范围的索引扫描,出现range,则一定是基于索引。
    4. ref:查找条件列使用了索引而且不为主键和unique,有多条。
    5. eq_ ref:索引查找且只有一条数据,一般索引列是唯一的。
    6. const:主键在where后面的查询。
    7. systen:表中只有一条数据。

    possible_ keyskey、Key_len

     possible_ keys:理论上使用到的索引

     key:实际使用的索引,

    Key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好
    key_ len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_ len是 根据表定义计算而得,不是通过表内检索出的

    值如果为null:未使用、未建立、失效

    ref

    格式:库.表.列

    显示索引的哪一列被使用了,有时候会是一个常量:表示哪些列或常量被用于用于查找索引列上的值

    rows

    根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。 

    Extra

     额外的信息说明

    展开全文
  • Mysql中的执行计划

    2019-07-14 16:46:00
    1.什么是执行计划 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。...通过EXPLAIN关键分析的结果由以下列组成,...

    1. 什么是执行计划

    使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。

    2. 执行计划的作用

    • 表的读取顺序
    • 数据读取操作的操作类型
    • 哪些索引可以使用
    • 哪些索引被实际使用
    • 表之间的引用
    • 每张表有多少行被优化器查询

    3. 执行计划详解

    通过EXPLAIN关键分析的结果由以下列组成,接下来挨个分析每一个列

     

    3.1 ID列

    ID列:描述select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序

    根据ID的数值结果可以分成一下三种情况

    • id相同:执行顺序由上至下

    • id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

    • id相同不同:同时存在

    id如果相同,可以认为是一组,从上往下顺序执行;

    在所有组中,id值越大,优先级越高,越先执行

    3.2 select_type列

     表 a1,a2,a3结构是一样的

    3.2.1 SIMPLE

    简单的 select 查询,查询中不包含子查询或者UNION

    EXPLAIN
    SELECT * FROM a1;

    3.2.2 PRIMARYSUBQUERY

    PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为

    SUBQUERY:在SELECTWHERE列表中包含了子查询

     

    EXPLAIN
    SELECT * FROM a1 WHERE id = (SELECT id FROM a2 WHERE id = 1);

     

    3.2.3  DERIVED

    FROM列表中包含的子查询被标记为DERIVED(衍生)

    MySQL会递归执行这些子查询, 把结果放在临时表里。

    EXPLAIN
    SELECT * FROM a1 a,(SELECT id FROM a2 WHERE id = 1) b WHERE a.id = b.id;

     

    3.2.4 UNION RESULT UNION

    UNION:若第二个SELECT出现在UNION之后,则被标记为UNION

    UNION RESULT:从UNION表获取结果的SELECT

     

    EXPLAIN
    SELECT * FROM a2 UNION SELECT * FROM a3;

     

    3.3 table

    显示这一行的数据是关于哪张表的

    3.4 Type

    type显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是:

    system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

    需要记忆的

    system>const>eq_ref>ref>range>index>ALL

    一般来说,得保证查询至少达到range级别,最好能达到ref。

    3.4.1 System与const

    System:表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计

    Const:表示通过索引一次就找到了

    const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快

    如将主键置于where列表中,MySQL就能将该查询转换为一个常量

    EXPLAIN
    SELECT * FROM a1 a,(SELECT id FROM a2 WHERE id = 1) b WHERE a.id = b.id;

    注意的是 SELECT id FROM a2 WHERE id = 1 可以作为一个临时表,里面只是存放了一条记录;

    3.4.2 eq_ref

     唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描

    EXPLAIN SELECT * FROM a1 a,a2 b WHERE a.id = b.id

     

    3.4.3 Ref

    非唯一性索引扫描,返回匹配某个单独值的所有行.

    本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体

     

    EXPLAIN
    SELECT * FROM a2 WHERE NAME = '张三'

     

    3.4.4  Range

    只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引

    一般就是在你的where语句中出现了between<>in等的查询

    这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。

    3.4.5  Index

    当查询的结果全为索引列的时候,虽然也是全部扫描,但是只查询的索引库,而没有去查询

    数据。

    EXPLAIN
    SELECT id FROM a2

    但是我们需要注意的是,要是下面的sql,就不是index了

    EXPLAIN
    SELECT id FROM a2 WHERE NAME = '张三'

     

    3.5 possible_keys Key

     

    possible_keys:可能使用的key

     

    Key:实际使用的索引。如果为NULL,则没有使用索引

     

    查询中若使用了覆盖索引,则该索引和查询的select字段重叠

     

    这里的覆盖索引非常重要,后面会单独的来讲

    3.6 key_len

    Key_len表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好。

    key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

    * key_len表示索引使用的字节数,

    * 根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断所有的索引字段是否都被查询用到。

    * char和varchar跟字符编码也有密切的联系,

    * latin1占用1个字节,gbk占用2个字节,utf8占用3个字节。(不同字符编码占用的存储空间不同)

    3.6.1 字符类型

    3.6.1.1 字符类型-索引字段为char类型+不可为Null

     

    name这一列为char(10),字符集为utf-8占用3个字节

     

    Keylen=10*3

     

    3.6.1.2 字符类型-索引字段为char类型+不可为Null时

    name这一列为char(10),字符集为utf-8占用3个字节,外加需要存入一个null

    Keylen=10*3+1(null) 结果为31

     

    3.6.1.3 索引字段为varchar类型+不可为Null

     

    Keylen=varchar(n)变长字段+不允许Null=n*(utf8=3,gbk=2,latin1=1)+2

     

    3.6.1.4 索引字段为varchar类型+允许为Null

     

    Keylen=varchar(n)变长字段+允许Null=n*(utf8=3,gbk=2,latin1=1)+1(NULL)+2

     

    3.6.2 数值类型

    CREATE TABLE `numberKeyLen ` (

    `c0`  int(255) NOT NULL ,

    `c1`  tinyint(255) NULL DEFAULT NULL ,

    `c2`  smallint(255) NULL DEFAULT NULL ,

    `c3`  mediumint(255) NULL DEFAULT NULL ,

    `c4`  int(255) NULL DEFAULT NULL ,

    `c5`  bigint(255) NULL DEFAULT NULL ,

    `c6`  float(255,0) NULL DEFAULT NULL ,

    `c7`  double(255,0) NULL DEFAULT NULL ,

    PRIMARY KEY (`c0`),

    INDEX `index_tinyint` (`c1`) USING BTREE ,

    INDEX `index_smallint` (`c2`) USING BTREE ,

    INDEX `index_mediumint` (`c3`) USING BTREE ,

    INDEX `index_int` (`c4`) USING BTREE ,

    INDEX `index_bigint` (`c5`) USING BTREE ,

    INDEX `index_float` (`c6`) USING BTREE ,

    INDEX `index_double` (`c7`) USING BTREE

    )

    ENGINE=InnoDB

    DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci

    ROW_FORMAT=COMPACT;

    EXPLAIN

    select * from  numberKeyLen where c1=1;

    EXPLAIN

    select * from  numberKeyLen where c2=1;

    EXPLAIN

    select * from  numberKeyLen where c3=1;

    EXPLAIN

    select * from  numberKeyLen where c4=1;

    EXPLAIN

    select * from  numberKeyLen where c5=1;

    EXPLAIN

    select * from  numberKeyLen where c6=1;

    EXPLAIN

    select * from  numberKeyLen where c7=1;

    3.6.3 日期和时间

    3.6.4 总结:

    ¥ 字符类型

    变长字段需要额外的2个字节(VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节),所以VARCAHR索引长度计算时候要加2),固定长度字段不需要额外的字节。

    而NULL都需要1个字节的额外空间,所以索引字段最好不要为NULL,因为NULL让统计更加复杂并且需要额外的存储空间。

    复合索引有最左前缀的特性,如果复合索引能全部使用上,则是复合索引字段的索引长度之和,这也可以用来判定复合索引是否部分使用,还是全部使用。

    ¥ 整数/浮点数/时间类型的索引长度

    NOT NULL=字段本身的字段长度

    NULL=字段本身的字段长度+1(因为需要有是否为空的标记,这个标记需要占用1个字节)

    datetime类型在5.6中字段长度是5个字节,datetime类型在5.5中字段长度是8个字节

     3.7 ref

    显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值

    3.8 Extra

    包含不适合在其他列中显示但十分重要的额外信息。

    当发现有Using filesort 后,实际上就是发现了可以优化的地方

     

    尤其发现在执行计划里面有using filesort而且还有Using temporary的时候,特别需要注意

     

    转载于:https://www.cnblogs.com/lys-lyy/p/11184728.html

    展开全文
  • 2.执行计划的作用表的读取顺序数据读取操作的操作类型哪些索引可以使用哪些索引被实际使用表之间的引用每张表多少行被优化器查询3.执行计划详解通过EXPLAIN关键分析的结果由以下列组成,接下来挨个分析每一个列3.1...

    1. 什么是执行计划

    使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。

    2. 执行计划的作用

    表的读取顺序

    数据读取操作的操作类型

    哪些索引可以使用

    哪些索引被实际使用

    表之间的引用

    每张表有多少行被优化器查询

    3. 执行计划详解

    通过EXPLAIN关键分析的结果由以下列组成,接下来挨个分析每一个列

    4df252f33813b428550fae216927c8f9.png

    3.1 ID列

    ID列:描述select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序

    根据ID的数值结果可以分成一下三种情况

    id相同:执行顺序由上至下

    68b97c3159fdbed43ecd11f873aaf88e.png

    id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

    c7fb59ab28b07b94aa4bf379ef93053b.png

    id相同不同:同时存在

    a5de700c4e270ed3a9a5deb902d465ef.png

    id如果相同,可以认为是一组,从上往下顺序执行;

    在所有组中,id值越大,优先级越高,越先执行

    3.2select_type列

    65407e0538196475341d2747debe1497.png

    表 a1,a2,a3结构是一样的

    6aee3cff71e88d68b58e73f5253bf24b.png

    3.2.1 SIMPLE

    简单的 select 查询,查询中不包含子查询或者UNION

    EXPLAIN

    SELECT * FROM a1;

    e61d6e2da017c1c79816634991d3663b.png

    3.2.2 PRIMARY与SUBQUERY

    PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为

    SUBQUERY:在SELECT或WHERE列表中包含了子查询

    EXPLAIN

    SELECT * FROM a1 WHERE id = (SELECT id FROM a2 WHERE id = 1);

    f1a981c4087709bb1544a0ba25487025.png

    3.2.3  DERIVED

    在FROM列表中包含的子查询被标记为DERIVED(衍生)

    MySQL会递归执行这些子查询,把结果放在临时表里。

    EXPLAIN

    SELECT * FROM a1 a,(SELECT id FROM a2 WHERE id = 1) b WHERE a.id = b.id;

    9fba47716e1e8637a8e788776a7455d4.png

    3.2.4 UNION RESULT 与UNION

    UNION:若第二个SELECT出现在UNION之后,则被标记为UNION;

    UNION RESULT:从UNION表获取结果的SELECT

    EXPLAIN

    SELECT * FROM a2 UNION SELECT * FROM a3;

    851b12943140b8436ba86300faf06e8e.png

    3.3 table列

    显示这一行的数据是关于哪张表的

    3.4 Type列

    type显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是:

    system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

    需要记忆的

    system>const>eq_ref>ref>range>index>ALL

    一般来说,得保证查询至少达到range级别,最好能达到ref。

    3.4.1 System与const

    System:表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计

    Const:表示通过索引一次就找到了

    const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快

    如将主键置于where列表中,MySQL就能将该查询转换为一个常量

    EXPLAIN

    SELECT * FROM a1 a,(SELECT id FROM a2 WHERE id = 1) b WHERE a.id = b.id;

    c4329f308b63eee2411ec7cb7d2fac33.png

    注意的是 SELECT id FROM a2 WHERE id = 1 可以作为一个临时表,里面只是存放了一条记录;

    3.4.2 eq_ref

    唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描

    EXPLAIN SELECT * FROM a1 a,a2 b WHERE a.id = b.id

    0f888b314801ee42882b3a9f34143f2d.png

    3.4.3 Ref

    非唯一性索引扫描,返回匹配某个单独值的所有行.

    本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体

    EXPLAIN

    SELECT * FROM a2 WHERE NAME = '张三'

    9dd7836879b2f46f12f06f52383dddda.png

    3.4.4  Range

    只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引

    一般就是在你的where语句中出现了between、、in等的查询

    这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。

    3.4.5  Index

    当查询的结果全为索引列的时候,虽然也是全部扫描,但是只查询的索引库,而没有去查询

    数据。

    EXPLAIN

    SELECT id FROM a2

    001fe045bf4e1934c03a50f39dd92cbb.png

    但是我们需要注意的是,要是下面的sql,就不是index了

    EXPLAIN

    SELECT id FROM a2 WHERE NAME = '张三'

    f331d9137c80a8a8f97c4d2a99d970fa.png

    3.5 possible_keys 与Key

    possible_keys:可能使用的key

    Key:实际使用的索引。如果为NULL,则没有使用索引

    查询中若使用了覆盖索引,则该索引和查询的select字段重叠

    这里的覆盖索引非常重要,后面会单独的来讲

    3.6 key_len

    Key_len表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好。

    key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

    518882536a09b1be2ff029ef6a399d5e.png

    * key_len表示索引使用的字节数,

    * 根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断所有的索引字段是否都被查询用到。

    * char和varchar跟字符编码也有密切的联系,

    * latin1占用1个字节,gbk占用2个字节,utf8占用3个字节。(不同字符编码占用的存储空间不同)

    3.6.1 字符类型

    0995e4dc96823b183388ea512cdafeaf.png

    3.6.1.1 字符类型-索引字段为char类型+不可为Null时

    name这一列为char(10),字符集为utf-8占用3个字节

    Keylen=10*3

    63f1a79c5679eeb634f01a5d1f276cdc.png

    3.6.1.2 字符类型-索引字段为char类型+不可为Null时

    name这一列为char(10),字符集为utf-8占用3个字节,外加需要存入一个null值

    Keylen=10*3+1(null) 结果为31

    2ebab3b1f2c9931cda69ddbd752c62d3.png

    3.6.1.3 索引字段为varchar类型+不可为Null时

    Keylen=varchar(n)变长字段+不允许Null=n*(utf8=3,gbk=2,latin1=1)+2

    f41ec884df37cce671f3db1a4272e22a.png

    3.6.1.4 索引字段为varchar类型+允许为Null时

    Keylen=varchar(n)变长字段+允许Null=n*(utf8=3,gbk=2,latin1=1)+1(NULL)+2

    9235fbb646fa2e7888782c42cb280585.png

    3.6.2 数值类型

    86631c80cce476c51a6d60d85a6aa4d7.png

    CREATE TABLE `numberKeyLen ` (

    `c0`  int(255) NOT NULL ,

    `c1`  tinyint(255) NULL DEFAULT NULL ,

    `c2`  smallint(255) NULL DEFAULT NULL ,

    `c3`  mediumint(255) NULL DEFAULT NULL ,

    `c4`  int(255) NULL DEFAULT NULL ,

    `c5`  bigint(255) NULL DEFAULT NULL ,

    `c6`  float(255,0) NULL DEFAULT NULL ,

    `c7`  double(255,0) NULL DEFAULT NULL ,

    PRIMARY KEY (`c0`),

    INDEX `index_tinyint` (`c1`) USING BTREE ,

    INDEX `index_smallint` (`c2`) USING BTREE ,

    INDEX `index_mediumint` (`c3`) USING BTREE ,

    INDEX `index_int` (`c4`) USING BTREE ,

    INDEX `index_bigint` (`c5`) USING BTREE ,

    INDEX `index_float` (`c6`) USING BTREE ,

    INDEX `index_double` (`c7`) USING BTREE

    )

    ENGINE=InnoDB

    DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci

    ROW_FORMAT=COMPACT;

    EXPLAIN

    select * from  numberKeyLen where c1=1;

    EXPLAIN

    select * from  numberKeyLen where c2=1;

    EXPLAIN

    select * from  numberKeyLen where c3=1;

    EXPLAIN

    select * from  numberKeyLen where c4=1;

    EXPLAIN

    select * from  numberKeyLen where c5=1;

    EXPLAIN

    select * from  numberKeyLen where c6=1;

    EXPLAIN

    select * from  numberKeyLen where c7=1;

    3.6.3 日期和时间

    688babc1e2efcd5851dc0579a56bf0e3.png

    3.6.4 总结:

    ¥ 字符类型

    变长字段需要额外的2个字节(VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节),所以VARCAHR索引长度计算时候要加2),固定长度字段不需要额外的字节。

    而NULL都需要1个字节的额外空间,所以索引字段最好不要为NULL,因为NULL让统计更加复杂并且需要额外的存储空间。

    复合索引有最左前缀的特性,如果复合索引能全部使用上,则是复合索引字段的索引长度之和,这也可以用来判定复合索引是否部分使用,还是全部使用。

    ¥ 整数/浮点数/时间类型的索引长度

    NOT NULL=字段本身的字段长度

    NULL=字段本身的字段长度+1(因为需要有是否为空的标记,这个标记需要占用1个字节)

    datetime类型在5.6中字段长度是5个字节,datetime类型在5.5中字段长度是8个字节

    3.7 ref

    显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值

    3.8 Extra

    包含不适合在其他列中显示但十分重要的额外信息。

    6d94f257b27c3cc9a261c535b08676cc.png

    当发现有Using filesort 后,实际上就是发现了可以优化的地方

    尤其发现在执行计划里面有using filesort而且还有Using temporary的时候,特别需要注意

    展开全文
  • 本文接前文,继续通过几个相关问题的阐述,解开数据库加密的神秘面纱。 如何弥补数据库加密系统对数据库保护的不足? 通过配套使用数据库审计、数据库防火墙、数据库...2. 数据库加密的关键技术有哪些? 1...
  • 入门之C#

    2018-08-05 22:46:00
    C#也是一样,首先要知道C#中的基本数据类型有哪些,都是什么,分别是什么意思,然后再开始慢慢的学习一些控制流语句,所谓的控制流语句就是诸如:if if...else... switch while do...while for foreach等等这些,...
  • 11、struts.xml中result的type有哪些类型? 91 12、什么时候用JDBC什么时候用Hibernete; 91 13、hibernate 数据的三个状态 91 14、Hibernate中load和get的区别? 92 15、Hibernate的工作原理? 92 16、hibernate优...
  • 第一次技术面试-美团一面

    千次阅读 2017-08-30 08:43:05
    3.集合-你了解的集合有哪些?分别简要介绍?hashmap与hashtable的区别? 4.手写程序-非递归方式后序遍历二叉树 5.项目技术考察-kylin的关键技术,比如去重技术等? 6.SQL语句--统计两个交叉日期内的不同类型的...
  • 真正重要的是响应时间,而且要知道在整个SQL语句的执行过程中每个步骤都花费了多长时间,要知道哪些步骤是拖垮执行效率的关键步骤,想要做到这点,必须要知道查询的生命周期,然后进行优化,不同的应用场景不同的...
  • 确定有哪些函数组成该程序,并且说明每个函数的原型、功能或目的;每个函数要借助于哪些函数共同完成了什么功能; ③编码与验证 程序的主界面;各个函数的伪代码或流程图;程序的使用说明;程序功能上的验证性测试;...
  • 空间,这些内容决定了变量在程序的哪些部分是可见的。 第10章:对象和类 类是用户定义的类型,对象(如变量)是类的实例。本章介绍面向对象编程和类设计。对象声明描述的是存 储在对象中的信息以及可对对象执行的...
  • 空间,这些内容决定了变量在程序的哪些部分是可见的。 第10章:对象和类 类是用户定义的类型,对象(如变量)是类的实例。本章介绍面向对象编程和类设计。对象声明描述的是存 储在对象中的信息以及可对对象执行的...
  • 空间,这些内容决定了变量在程序的哪些部分是可见的。 第10章:对象和类 类是用户定义的类型,对象(如变量)是类的实例。本章介绍面向对象编程和类设计。对象声明描述的是存 储在对象中的信息以及可对对象执行的...
  • 3.1.6 C中变量的存储类型有哪些? 3.1.7 动态规划的本质 3.1.8 实践中如何优化MySQL? 3.1.9 什么情况下设置了索引但无法使用? 3.2.0 SQL语句的优化 3.2.1 数据库索引的底层实现原理和优化 3.2.2 HTTP和HTTPS的...
  • java面试宝典

    2013-02-28 16:04:01
    1、面向对象的特征有哪些方面? 8 2、作用域public,private,protected,以及不写时的区别? 8 3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确? 8 5、语句float f=1.3;编译能否通过? 8 6、short ...
  • 千方百计笔试题大全

    2011-11-30 21:58:33
    1、面向对象的特征有哪些方面? 8 2、作用域public,private,protected,以及不写时的区别? 8 3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确? 8 5、语句float f=1.3;编译能否通过? 8 6、short ...
  • CruiseYoung提供的带详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐) 基本信息 原书名: Pro Oracle SQL 原出版社: ...
  • CruiseYoung提供的带详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 该资料是《Oracle SQL高级编程》的源代码 对应的书籍资料见: Oracle SQL高级编程(资深Oracle专家力作,...
  • CruiseYoung提供的带详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 Oracle Database 9i/10g/11g编程艺术:深入数据库体系结构:第2版(世界顶级专家Thomas Kyte力作) 基本信息 原...
  • CruiseYoung提供的带详细...这几章是本书的精华,而且也是理解Oracle的关键所在。第9章讨论redo和undo,解释了它们分别是什么,并指出如何避免各种可能出现的错误。第10章介绍了各种类型的表,其中最重要的是堆组织表...
  • java 面试题 总结

    2009-09-16 08:45:34
    1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    34.EJB规范规定EJB中禁止的操作有哪些? 35.java除了8种基本类型外,在虚拟机里还有哪一种,有什么作用? 36.除了使用new关键字创建对象意外,试列举另外三种以上创建实例的方式? 37.classloader中,JDK的API、...
  • 有哪些主要模型? 答:软件生存周期模型是描述软件开发过程中各种活动如何执行的模型。 主要模型包括:瀑布模型、增量模型、螺旋模型、喷泉模型、变换模型和基于知识的模型。 5. 有哪些主要的软件开发方法? ...
  • 2.12.3 赋值语句中的隐式类型转换 54 2.13 再谈数值数据类型 55 2.13.1 字符类型 56 2.13.2 字符的输入输出 57 2.13.3 宽字符类型 60 2.13.4 枚举 60 2.13.5 存储布尔值的变量 63 2.13.6 复数类型 63 2.14 ...
  • 2.12.3 赋值语句中的隐式类型转换 54 2.13 再谈数值数据类型 55 2.13.1 字符类型 56 2.13.2 字符的输入输出 57 2.13.3 宽字符类型 60 2.13.4 枚举 60 2.13.5 存储布尔值的变量 63 2.13.6 复数类型 63 2.14 ...
  • 软件测试规范

    2018-04-23 09:16:12
    1.语句覆盖 ............................................................................................................................................ 10 2.判定理盖 .....................................
  • flash shiti

    2014-03-14 10:32:41
    36.以下语句说法正确的: A. getURL表示使浏览器浏览到指定页面 B. gotoAndPlay表示跳转到指定帧并播放 C. gotoAddStop表示跳转到指定帧并停止播放 D. loadMovie表示引入一个外部电影到指定层 37.比较运算符...
  • springmybatis

    2015-09-05 06:54:28
    3. 在User.xml 文件里面 主要是定义各种SQL 语句,以及这些语句的参数,以及要返回的类型等. 开始测试 在test_src 源码目录下建立com.yihaomen.test这个package,并建立测试类Test: 程序代码 程序代码 package ...
  • 《数据结构 1800题》

    热门讨论 2012-12-27 16:52:03
    13. 下面程序段中带下划线的语句的执行次数的数量级是( ) 【合肥工业大学 2001 三、1(2分)】 i:=n*n WHILE i<>1 DO i:=i div 2; 14. 计算机执行下面的语句时,语句 s的执行次数为 _______ 。【南京理工大学 ...

空空如也

空空如也

1 2 3
收藏数 54
精华内容 21
关键字:

关键语句有哪些类型