查看更多宝典,请点击《金三银四,你的专属面试宝典》html
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL受权许可 MariaDB的目的是彻底兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB。 MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美圆的价格,将本身建立的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购,MySQL的全部权也落入Oracle的手中。MariaDB名称来自Michael Widenius的女儿Maria的名字。mysql
MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM存储引擎,它使用了Percona的 XtraDB,InnoDB的变体,分支的开发者但愿提供访问即将到来的MySQL 5.4 InnoDB性能。这个版本还包括了 PrimeBase XT (PBXT) 和 FederatedX存储引擎。面试
2.1 没有链接到MySQL服务器,就想查看MySQL的版本。打开cmd,切换至mysql的bin目录,运行下面的命令便可:sql
mysql -V 或 mysqladmin --version 或 mysql --help|find "Distrib"数据库
2.2 若是已经链接到了MySQL服务器,则运行下面的命令:编程
select version(); 或 status 或 \s后端
2.3 在命令行链接上MySQL服务器时,其实就已经显示了MySQL的版本,如:缓存
mysql -uroot -padmins安全
3.1 mysql密码服务器
mysql初始密码为空,默认端口3306,默认最大链接数为100;
修改密码方式:
在DOS下进入目录mysql\bin,而后键入如下命令:
mysqladmin -u用户名 -p旧密码 password 新密码
如: mysqladmin -u root -p ab12 password djg345
3.2 命令行修改root密码:
mysql> UPDATE mysql.user SET password=PASSWORD(’新密码’) WHERE User=’root’;
mysql> FLUSH PRIVILEGES;
显示当前的user:
mysql> SELECT USER();
3.4 命令行下数据库的操做
使用 show databases; 展现全部数据库;
使用 use+数据库名称 进入或改变当前使用的数据库;
使用 show+数据库名称 展现该数据库下的全部表;
3.5 查看表结构的方法:
登陆mysql,执行:
desc+表名 或 describe+表名 或 show columns from 表名 或 explain+表名;
使用mysql的工具mysqlshow.exe:
mysql+数据库名称+表名
3.6 如何导出与导入建表语句与数据
导出:mysqldump -uroot -padmins 数据库名 表名 > database_dump.sql
导入:mysql -uroot -padmins 数据库名 < database_dump.sql
3.7 如何备份全部数据库
导出数据库:mysqldump -uroot -padmins 数据库名 > database.sql
导入数据库:mysql -uroot -padmins 数据库名 < database.sql
另外可使用图形化界面进行导出导入
3.8 Mysql中有一个with rollup是用来在分组统计数据的基础上再进行统计汇总,即用来获得group by的汇总信息;
3.9 MySQL 临时表在咱们须要保存一些临时数据时是很是有用的。临时表只在当前链接可见,当关闭链接时,Mysql会自动删除表并释放全部空间。
经过mysql> CREATE TEMPORARY TABLE 表名 建立临时表,
数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而知足企业内大多数须要处理大量数据的应用程序的要求。 使用数据库引擎建立用于联机事务处理或联机分析处理数据的关系数据库。这包括建立用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。
MYSQL支持三个引擎:ISAM、MYISAM和HEAP
另外两种类型INNODB和BERKLEY(BDB),也经常可使用。若是技术高超,还可使用MySQL+API本身作一个引擎。
ISAM:ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到 数据库被查询的次数要远大于更新的次数。所以,ISAM执行读取操做的速度很快,并且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不 支持事务处理,也不可以容错:若是你的硬盘崩溃了,那么数据文件就没法恢复了。若是你正在把ISAM用在关键任务应用程序里,那就必须常常备份你全部的实 时数据,经过其复制特性,MYSQL可以支持这样的备份应用程序。
MyISAM:MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操做,其代价是你须要常常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操做,这可能就是为何MySQL受到了WEB开发如此青睐的主要缘由:在WEB开发中你所进行的大量数据操做都是读取操做。因此,大多数虚拟主机提供商和INTERNET平台提供商只容许使用MYISAM格式。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。
HEAP:HEAP容许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,可是它所管理的数据是不稳定的,并且若是在关机以前没有进行保存,那么全部的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你须要使用SELECT表达式来选择和操控数据的时候很是有用。要记住,在用完表格以后就删除表格。
InnoDB:InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL+API。在使用MYSQL的时候,你所面对的每个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢不少,可是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,若是你的设计须要这些特性中的一者 或者二者,那你就要被迫使用后两个引擎中的一个了。
若是感受本身的确技术高超,你还可以使用MySQL+API来建立本身的数据库引擎。这个API为你提供了操做字段、记录、表格、数据库、链接、安全账号的功能,以及创建诸如MySQL这样DBMS所须要的全部其余无数功能。深刻讲解API已经超出了本文的范围,可是你须要了解MySQL+API的存在及其可交换引擎背后的技术,这一点是很重要的。估计这个插件式数据库引擎的模型甚至可以被用来为MySQL建立本地的XML提供器(XML provider)。(任何读到本文的MySQL+API开发人员能够把这一点看成是个要求。)
InnoDB和MyISAM是许多人在使用MySQL时最经常使用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差异为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,可是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
通常来讲,MyISAM适合:
(1)作不少count 的计算; (2)插入不频繁,查询很是频繁; (3)没有事务。
InnoDB适合:
(1)可靠性要求比较高,或者要求事务; (2)表更新和查询都至关的频繁,而且表锁定的机会比较大的状况指定数据引擎的建立
如何查看MySQL的当前存储引擎?
通常状况下,mysql会默认提供多种存储引擎,你能够经过下面的查看:
看你的mysql如今已提供什么存储引擎:
mysql> show engines;
看你的mysql当前默认的存储引擎:
mysql> show variables like '%storage_engine%';
你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):
mysql> show create table 表名;
Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的。
数据库一般不会被直接使用,而是由其余编程语言经过SQL语句调用mysql,由mysql处理并返回执行结果。那么Mysql接受到SQL语句后,又是如何处理的呢?
首先程序的请求会经过mysql的connectors与其进行交互,请求处处后,会暂时存放在链接池(connection pool)中并由处理器(Management Serveices & Utilities)管理。当该请求从等待队列进入处处理队列,管理器会将该请求丢给SQL接口(SQL Interface)。SQL接口接收到请求后,它会将请求进行hash处理并与缓存中的结果进行对比,若是彻底匹配则经过缓存直接返回处理结果;不然,须要完整的走一趟流程:
(1)由SQL接口丢给后面的解释器(Parser),上面已经说到,解释器会判断SQL语句正确与否,若正确则将其转化为数据结构。
(2)解释器处理完,便来到后面的优化器(Optimizer),它会产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果。
(3)肯定最优执行计划后,SQL语句此时即可以交由存储引擎(Engine)处理,存储引擎将会到后端的存储设备中取得相应的数据,并原路返回给程序。
DDL:数据定义语言
包含:
一、``CREATE` `: 在数据库中建立新的数据对象
二、``ALTER` `: 修改数据库中对象的数据结构
三、``DROP` `: 删除数据库中的对象
四、DISABLE/ENABLE ``TRIGGER` `: 修改触发器的状态
五、``UPDATE` `STATISTIC : 更新表/视图统计信息
六、``TRUNCATE` `TABLE` `: 清空表中数据
七、COMMENT : 给数据对象添加注释
八、RENAME : 更改数据对象名称
DML:数据操做语言
包含:
一、``INSERT` `:将数据插入到表或视图
二、``DELETE` `:从表或视图删除数据
三、``SELECT` `:从表或视图中获取数据
四、``UPDATE` `:更新表或视图中的数据
五、MERGE : 对数据进行合并操做(插入/更新/删除)
DCL:数据控制语言
包含:
一、``GRANT` `: 赋予用户某种控制权限
二、``REVOKE` `:取消用户某种控制权限
TCL:事务控制语言
包含:
一、``COMMIT` `: 保存已完成事务动做结果
二、SAVEPOINT : 保存事务相关数据和状态用以可能的回滚操做
三、``ROLLBACK` `: 恢复事务相关数据至上一次``COMMIT``操做以后
四、``SET` `TRANSACTION` `: 设置事务选项
事务是并发控制的单位,是用户定义的一个操做序列。这些操做要么都作,要么都不作,是一个不可分割的工做单位。
事务的ACID/四大特征:
原子性:表示事务内操做不可分割。要么都成功、要么都是失败;
一致性:要么都成功、要么都是失败.后面的失败了要对前面的操做进行回滚;
隔离性:一个事务开始后,不能后其余事务干扰;
持久性/持续性:表示事务开始了,就不能终止。
脏读:是指在一个事务处理过程里读取了另外一个未提交的事务中的数据。
当一个事务正在屡次修改某个数据,而在这个事务中这屡次的修改都还未提交,这时一个并发的事务来访问该数据,就会形成两个事务获得的数据不一致。例如:用户A向用户B转帐100元,对应SQL命令以下
update account set money=money+100 where name=’B’; (此时A通知B)
update account set money=money - 100 where name=’A’;
当只执行第一条SQL时,A通知B查看帐户,B发现确实钱已到帐(此时即发生了脏读),而以后不管第二条SQL是否执行,只要该事务不提交,则全部操做都将回滚,那么当B之后再次查看帐户时就会发现钱其实并无转。
不可重复读:是指在对于数据库中的某个数据,一个事务范围内屡次查询却返回了不一样的数据值,这是因为在查询间隔,被另外一个事务修改并提交了。
例如事务T1在读取某一数据,而事务T2立马修改了这个数据而且提交事务给数据库,事务T1再次读取该数据就获得了不一样的结果,发送了不可重复读。
不可重复读和脏读的区别是,脏读是某一事务读取了另外一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
在某些状况下,不可重复读并非问题,好比咱们屡次查询某个数据固然以最后查询获得的结果为主。但在另外一些状况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不一样,A和B就可能打起来了……
幻读:是事务非独立执行时发生的一种现象。
例如事务T1对一个表中全部的行的某个数据项作了从“1”修改成“2”的操做,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值仍是为“1”而且提交给数据库。而操做事务T1的用户若是再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉同样,这就是发生了幻读。
幻读和不可重复读都是读取了另外一条已经提交的事务(这点就脏读不一样),所不一样的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据总体(好比数据的个数)。
如今来看看MySQL数据库为咱们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何状况都没法保证。
以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,固然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(相似于Java多线程中的锁)使得其余的线程只能在锁外等待,因此平时选用何种隔离级别应该根据实际状况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。
在MySQL数据库中查看当前事务的隔离级别:
select @@tx_isolation;
在MySQL数据库中设置事务的隔离级别:
set [glogal | session] transaction isolation level 隔离级别名称;
set tx_isolation=’隔离级别名称;’
索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,若是表中查询的列有一个索引,MySQL可以快速到达一个位置去搜索数据文件,而没必要查看全部数据,那么将会节省很大一部分时间。
索引咱们分为四类来:
单列索引:一个索引只包含单个列,但一个表中能够有多个单列索引。
断裂索引又分为:
普通索引:MySQL中基本索引类型,没有什么限制,容许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。
惟一索引:索引列中的值必须是惟一的,可是容许为空值。
主键索引:是一种特殊的惟一索引,不容许有空值。
组合索引:在表中的多个字段组合上建立的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。
全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,介绍了要求,说说什么是全文索引,就是在一堆文字中,经过其中的某个关键字等,就能找到该字段所属的记录行,好比有"你是个大煞笔,二货 ..." 经过大煞笔,可能就能够找到该条记录。
空间索引:空间索引是对空间数据类型的字段创建的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。
空间索引是对空间数据类型的字段创建的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。
在建立空间索引时,使用SPATIAL关键字。要求,引擎为MyISAM,建立空间索引的列,必须将其声明为NOT NULL。
建立索引方法:
create index 索引名 on 表名(字段名);
alter table 表名 add index 索引名(字段名);
create table(id int not null,username varchar(10),index 索引名(username(length)));
删除索引方法:
ALTER TABLE 表名 DROP INDEX 索引名;
DROP INDEX 索引名 ON 表名;
查看索引:
可使用 SHOW INDEX 命令来列出表中的相关的索引信息。能够经过添加 \G 来格式化输出信息。
如:mysql> SHOW INDEX FROM table_name; \G
1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树、B_树)。
数据库索引底层经常使用就是用就是B树或者是B+树这种结构
先说说树吧,其实树就是从一个根节点出发,其能够有不少子节点,而子节点又能够有不少子节点,这样就像咱们现实生活中的树同样,不过咱们这颗树是倒立的!由于树的分支太多且没有规律因此很难控制,要想让树发挥他的做用就得在基本的树结构上加上一些特性,让有了特性的树成为帮助咱们解决问题的结构,最经常使用的就是二叉树了,二叉树听名字就知道是一个节点至多只有两个节点,这样对数进行了必定的限制,整棵树看起来就顺眼多了。
二叉树的拓展1:二叉搜索树,二叉搜索树的节点知足一个规律,父节点的左孩子的键值小于父节点的键值,而右孩子的键值大于父节点的键值,这样当咱们在这颗数中查询某个键值时就能够根据当前节点的键值和要寻找的键值的大小比较,肯定该忘哪条路走下去。二叉搜索树还有一个特色就是中序遍历的时候其键值是按大小排序的。
二叉树的拓展2:平衡二叉树,因为咱们要插入的数据多是自己就排好序的,因此会致使插入数据时树变成线性的结构,只有一条路。。因而咱们须要保证二叉树的平衡,当发现这棵树要出现往一边倒的状况时就要想某种方式让其保持平衡(叶子节点的高度差最大为1),这就设计到一些节点的旋转,变换了。
二叉树的拓展3:红黑树,红黑树也是一种平衡二叉树,不过加入了一些新的特性,听名字就知道,在红黑树中节点的颜色要么是红色要么是黑色的,固然还有其余的一些特性,当插入或者删除数据破坏了红黑树的这些特性时,咱们须要进行一些操做(通常是颜色改变和树的旋转)红黑树保持其原有的特性。
因为二叉树是二叉的,因此当树的节点不断增长时就会致使树的高度不断的增长,因此查询的效率就很低了,当咱们面对海量数据(像数据库中保存的数据)的时候这种结构是不行的,因此咱们又衍生出了新的树结构。
二叉树的拓展4:B树,B数同样拥有自平衡的特性,最大的区别在于B树不是二叉的,而是多叉的,具体有多少个叉要根据树的阶数来判断。
二叉树的拓展5:B+树,和B树相比,B+树又增长了一些特性,B+树主要是为了方便查询一个区间的数据集合,由于咱们使用B树的时候要想查询某个区间内的数据得使用中序遍历将树中的数据所有遍历一遍,这样的时间复杂度是O(n),效率过低了。而B+树只用叶子节点保存具体值的地址,非叶子节点只保存其子节点的指针,叶子节点之间经过指针连接起来,是有序的,因此在查找一个范围内的数据是颇有效的。其时间复杂度为O(logn+M),M为要查找的数据个数。