银符考试题库B12
现在是:
试卷总分:100.0
您的得分:
考试时间为:
点击“开始答卷”进行答题
列名 | 解释 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Name | 表名 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Engine | 表的存储引擎,在MySQL4.1.2之前,该列的名字为Type | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Version | 表的.frm文件的版本号 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Row_format | 行存储格式(Fixed,Dynamic,Compressed,Redundant,Compact)。对于MyISAM引擎,可以是Dynalmc、 Fixed或Compressed。动态行的行长度可变,例如Varchar或Blob类型字段。固定行是指行长度不变,例如Char 和Integer类型字段 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
Rows | 行的数目。对于非事务性表,这个值是精确的,对于事务性引擎,这个值通常是估算的。例如MyISAM,存 储精确的数目。对于其他存储引擎,比如InnoDB,本值是一个大约的数,与实际值相差可达40~50%。在这 些情况下,使用SELECT COUNT(*)来获得准确的数目。对于在INFORMATION_SCHEMA数据库中的表,Rows 值为NULL |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
Avg_row_length | 平均每行包括的字节数 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Data_length | 表数据的大小(和存储引擎有关) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Max_data_length | 表可以容纳的最大数据量(和存储引擎有关) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Index_length | 索引的大小(和存储引擎有关) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Data_free | 对于MyISAM引擎,标识已分配,但现在未使用的空间,并且包含了已被删除行的空间 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Auto_increment | 下一个Auto_increment的值 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Create_time | 表的创建时间 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Update_time | 表的最近更新时间 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Check_time | 使用check table或myisamchk工具检查表的最近时间 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Collation | 表的默认字符集和字符排序规则 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Checksum | 如果启用,则对整个表的内容计算时的校验和 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Create_options | 指表创建时的其他所有选项 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment | 包含了其他额外信息,对于MyISAM引擎,包含了注释。对于InnoDB引擎,则保存着InnoDB表空间的剩 余空间信息。如果是一个视图,那么注释里面包含了VIEW字样 |
比较项目 | MyISAM | InnoDB | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
构成上的 区别 |
每个存储引擎类型为MyISAM的表在磁盘上存储 成3个文件:文件扩展名为.frm(frame)的文件存储 了表定义;文件扩展名为.MYD(MYData)的文件 存储了表数据;文件扩展名为MYI(MYIndex)的 文件存储了索引。数据文件和索引文件可以放置在不 同的目录下,平均分布I/O,以获得更快的速度 |
每个存储引擎类型为InnoDB的表在磁盘上存储成2个文件:.frm 和ibd文件。.frm文件存储了表定义。ibd文件分为数据区和索引区, 有较好的读写并发能力 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
事务处理 | MyISAM类型的表强调的是性能,其执行速度比 InnoDB类型更快,但是不提供事务支持 |
InnoDB提供事务支持、外键等高级数据库功能。InnoDB存储引擎 提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比 MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更 多的磁盘空间以保留数据和索引 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
适用场景 | 如果执行大量的SELECT,那么MyISAM是更好 的选择 |
1)如果执行大量的INSERT或UPDATE,那么出于性能方面的考 虑,应该使用InnoDB表 2)当执行DELETE FROM table时,InnoDB不会重建表,而是一 行一一行地删除 3)LOAD TABLE FROM MASTER操作对InnoDB是不起作用的, 解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成 InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表 不适用 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
清空表 | MyISAM会重建表 | InnoDB是一行一行地删除,效率非常慢 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
对AUTO_ INCREMENT 列的操作 |
1)MyISAM为INSERT和UPDATE操作自动更 新这一列。AUTO_INCREMENT值可用ALTER TABLE来重置 2)对于AUTO_INCREMENT类型的字段,InnoDB 中必须包含只有该字段的索引,但是在MyISAM表 中,可以和其他字段一起建立联合索引 |
如果为一个表指定AUTO_INCREMENT列,那么在数据字典里的 InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为 该列赋新值,自动增长计数器仅被存储在主内存中,而不是存在磁盘 上。InnoDB中必须包含只有该字段的索引 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
表的行数 | 当执行SQL语句“SELECT COUNT(*) FROM TABLE”时,MyISAM只是简单地读出保存好的行 数,需要注意的是,当COUNT(*)语句包含WHERE 条件时,MyISAM和InnoDB的操作是一样的 |
InnoDB中不保存表的具体行数,也就是说,当执行SELECT COUNT(*) FROM TABLE时,InnoDB要扫描一遍整个表来计算行数, 所以,InnoDB在做COUNT运算时相当消耗CPU |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
锁 | 表级锁定(更新时锁定整个表):其锁定机制是表 级索引,这虽然可以让锁定的实现成本很小,但是也 同时大大降低了其并发性能。不支持行级锁,只支持 并发插入的表锁,主要用于高负载的SELECT |
提供行锁(Locking on Row Level),提供与Oracle类型一致的不加 锁读取(Non-locking Read),另外,InnoDB表的行锁也不是绝对的, 如果在执行一个SQL语句时MySQL不能确定要扫描的范围,那么 InnoDB表同样会锁全表,例如UPDATE TABLE T_TEST_LHR SET NUM=1 WHERE NAME LIKE "%LHR%" |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
开发公司 | MySQL公司 | InnoDB公司 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
是否默认 存储引擎 |
是(5.5.8以前) | 是(5.5.8及其以后) |
共享表空间(Shared Tablespaces) |
独立表空间(File-Per-Table Tablespaces) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
优点 | 1)表空间可以分成多个文件 存放到各个磁盘,所以表也就可 以分成多个文件存放在磁盘上, 表的大小不受磁盘大小的限制 2)数据和文件放在一起方便 管理 |
1)当truncate或者drop一个表时可以释放磁盘空间。如果不是独立表空间,truncate或drop 一个表只是在ibdata文件内部释放,实际ibdata文件并不会缩小,释放出来的空间也只能让其似 InnoDB引擎的表使用 2)独立表空间下,truncate table操作会更快 3)独立表空间下,可以自定义表的存储位置,通过CREATE TABLE...DATA DIRECTDRY =absolute_path_to_directory命令实现(有时将部分热表放在不同的磁盘可有效地提升I/O性能) 4)独立表空间下,可以回收表空间碎片(比如一个非常大的DELETE操作之后释放的空间) 5)可以移动单独的InnoDB表,而不是整个数据库 6)可以copy单独的InnoDB表从一个实例到另外一个实例(也就是transportable tablespace特色) 7)独立表空间模式下,可以使用Barracuda的文件格式,这个文件格式有压缩和动态行模式 (Dynamic Row Format)的特色。当表中有blob或者text字段时,动态行模式可以发挥出更高彭 的存储 8)独立表空间模式下,可以更好地改善故障恢复,比如更加节约时间或者增加崩溃后正常恢 复的概率 9)单独备份和恢复某张表时会更快 10)可以从一个备份中单独分离出表,比如一个lvm的快照备份 11)可以在不访问MySQL的情况下方便地得知一个表的大小,即在文件系统的角度上查看 12)在大部分的linux文件系统中,如果InnoDB_flush_method为O_DIRECT,通常是不允许 针对同一个文件做并发写操作的。这时如果为独立表空间模式,那么应该会有较大的性能提升 13)如果没有使用独立表空间模式,那么所有的表都在共享表空间,最大为64TB,如果使用 innodb_file_per_table,那么每个表可以达到64TB 14)运行OPTIMEIZE TABLE,压缩或者重新创建表空间。运行OPTIMIZE TABLE InnoDB会 创建一个新的ibd文件。当完成时,老的表空间会被新的代替 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
缺点 | 1)所有的数据和索引存放到 一个文件,虽然可以把一个大文 件分成多个小文件,但是多个表 及索引在表空间中混合存储,当 数据量非常大的时候,表做了火 量删除操作后表空间中将会有 火量的空隙,特别是对于统计分 析,对于经常删除操作的这类应 用最不适合用共享表空间 2)共享表空间分配后不能回 缩:当临时建索引或创建一个临 时表后,表空间被扩大后,就是 删除相关的表也没办法回缩那 部分空间 3)进行数据库的冷备很慢 |
1)独立表空间模式下,每个表或许会有很多没用到的磁盘空间。如果没做好管理,可能会造 成较大的空间浪费。表空间中的空间只能被当前表使用 2)fsync操作必须运行在每一个单一的文件上,独立表空间模式下,多个表的写操作就无法台 并为一个单一的I/O,这样就添加许多额外的fsync操作 3)mysqld必须保证每个表都有一个open file,独立表空间模式下,这样就需要很多打开文付 数,可能会影响性能 4)当drop一个表空间时,buffer pool会被扫描,如果buffer pool有几十GB那么大,或许要 花费几秒钟时间。这个扫描操作还会产生一个内部锁,可能会延迟其他操作,共享表空间模式下 不会有这个问题 5)如果许多表都增长迅速,那么可能会产生更多的分裂操作(应该指的是表空间大小的扩充), 这个操作会损害drop table和table scan的性能 6)InnoDB_autoextend_increment参数对独立表空间无效,这个参数指的是当系统表空间满了 以后,它再次预先申请的磁盘空间大小,单位为MB 7)单表增加过大,当单表占用空间过大时,存储空间不足,只能从操作系统层面思考解决 方法 |
状态 | 含义 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Checking table | 正在检查数据表(这是自动的) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Closing tables | 正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果 不是这样的话,那么就应该确认磁盘空间是否已经满了或者磁盘是甭正处于重负中 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Connect out | 复制从服务器正在连接主服务器 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Copying to tmp table on disk | 由于临时结果集大于map_table_size,正在将临时表从内存存储转为磁盘存储,以此节省内存 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Creating tmp table | 正在创建临时表以存放部分查询结果 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Deleting from main table | 服务器正在执行多表删除中的第一部分,刚删除第一个表 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Deleting from reference tables | 服务器正在执行多表删除中的第二部分,正在删除其他表的记录 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Flushing tables | 正在执行FLUSH TABLES,等待其他线程关闭数据表 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Kilied | 发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。 MySQL会在每次的主循环中检查kill标志位,不过有些情况下该线程可能会过一小段才能死掉。如 果该线程被其他线程锁住了,那么kill请求会在锁释放时马上生效 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Locked | 被其他查询锁住了 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Sending data | 正在处理SELECT查询的记录,同时正在把结果发送给客户端 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Sorting for group | 正在为GROUPBY做排序 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Sorting for order | 正在为ORDERBY做排序 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Opening tables | 这个过程应该会很快,除非受到其他因素的干扰。例如,在执行完ALTER TABLE或LOCK TABLE 语句以前,数据表无法被其他线程打开。正尝试打开一个表 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Removing duplicates | 正在执行一个SELECT DISTINCT方式的查询,但是MySQL无法在前一个阶段优化掉那些重复 的记录。因此,MySQL需要再次去掉重复的记录,然后再把结果发送给客户端 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Reopen table | 获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表, 正尝试重新打开数据表 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Repair by sorting | 修复指令正在排序以创建索引 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Repair with keycache | 修复指令正在利用索引缓存一个一个地创建新索引。它会比Repair by sorting慢些 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Searching rows for update | 正在将符合条件的记录找出来以备更新。它必须在UPDATE要修改相关的记录之前就完成了 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Sleeping | 正在等待客户端发送新请求 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
System lock | 正在等待取得一个外部的系统锁。如果当前没有运行多个mysqld服务器同时请求同一个表,那么 可以通过增加--skip-extemal-locking参数来禁止外部系统锁 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Upgrading lock | INSERT DELAYED正在尝试取得一个锁表以插入新记录 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Updating | 正在搜索匹配的记录,并且修改它们 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
User lock | 正在等待GET_LOCK() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Waiting for tables | 该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了 能重新打开数据表,必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知:FLUSH TABLES tb1_name,ALTER TABLE,RENAME TABLE,REPAIR TABLE,ANALYZE TABLE或 OPTIMIZE TABLE |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Waiting for handler insert | INSERT DELAYED已经处理完了所有待处理的插入操作,正在等待新的请求 |