数据库 MySQL 面试题

MySQL

MySQL是一个小型关系数据库管理系统。

C++中使用MySQL

include 头文件
创建数据库句柄
连接数据库
调用mysql_query函数执行sql语句
返回结果

#include <mysql.h>
 #include <iostream>
 #include <cstring>
 #include <stdio.h>
 
 using namespace std;
 
 MYSQL mysql;    // 数据库句柄
 MYSQL_RES* res;    // 查询结果集
 MYSQL_ROW row;    // 记录结构体
 
 // 查询全部数据并输出
 void display() {
     // 查询数据
     int ret = mysql_query(&mysql, "select * from student;");
     
     // 获取结果集
     res = mysql_store_result(&mysql);
     
     cout << "ID " << "name " << "age " << "score" << endl;
     // 给row赋值,判断row是否为空,不为空就打印数据
     while (row = mysql_fetch_row(res)) {
         cout << row[0] << " ";
         cout << row[1] << " ";
         cout << row[2] << " ";
         cout << row[3] << endl;
     }
     // 释放结果集
     mysql_free_result(res);
 }
 
 int main() {
     // 初始化数据库
     mysql_init(&mysql);
     
     // 设置字符编码
     mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
     
     // 连接数据库
     if (mysql_real_connect(&mysql, "localhost", "root", "password", "数据库名", 3306, NULL, 0) == NULL) {
         printf("错误原因:%s\n", mysql_error(&mysql));
         printf("连接失败!\n");
         exit(-1);
     }
     
     display();
     
     // 关闭数据库
     mysql_close(&mysql);
     return 0;
 }

redis 和 mysql 的区别

redis 是 NoSQL,非关系型数据库,工作在内存中,数据都是以 key-value 来存的。MySQL 是关系型数据库,两者在很多方面都不同,比如索引和事务

以管理员身份打开命令行

启动服务器:net start mysql
停止服务器:net stop mysql

连接服务器:

1.mysql -u root -h 127.0.0.1 -p
2.输入密码 123456

断开服务器:

exit 或者 quit

Navicat

先命令行启动mysql服务器,再打开连接

主键(primary key)

用于唯一标识表中的每一条记录

创建数据库

create database 数据库名;

删除数据库

drop database 数据库名;

使用数据库

use 数据库名;

查看数据库

show databases;

查看数据库创建语句

show create database 数据库名;

SQL(Structured Query Language,结构化查询语言)

创建表

CREATE TABLE students ( student_id INT UNSIGNED, name VARCHAR(30), PRIMARY KEY (student_id) );

查看创建表语句

show create table 表名;

删除表

drop table 表名;

插入记录

INSERT INTO students (student_id, name) VALUE (41048101, 'Lucy') (123, 'Freeze'); INSERT INTO students VALUE (41048101, 'Lucy') (123, 'Freeze');

修改表结构

修改表名

alter table 旧表名 rename as 新表名;

添加字段

alter table 表名 add 字段名 列类型;

修改字段

alter table 表名 modify 字段名 列类型; alter table 表名 change 旧字段名 新字段名 列类型;

删除字段

alter table 表名 drop 字段名

修改记录

update 表名 set 字段1 = 值1, 字段2 =值2 where 条件;

删除记录

delete from 表名 where 条件;

索引

索引是一个单独的、存储在磁盘上的数据库结构,包含着对数据表里所有记录的引用指针
优点:
1.通过创建唯一索引,可以保证数据库表中每一行数据的唯一性
2.可以大大加快数据的查询速度
3.在实现数据的参考完整性方面,可以加速表和表之间的连接
4.在使用分组和排序语句进行数据查询时,也可以显著减少查询中分组和排序的时间
缺点:
1.创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加
2.索引需要占磁盘空间
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度

分类

普通索引:允许重复值和空值
唯一索引:索引列的值必须唯一,允许空值
组合索引:在表的多个字段组合上创建索引,列值的组合必须唯一,遵循最左前缀原则
主键索引:值唯一,不允许空值
全文索引:支持值的全文查找,允许重复值和空值,只有MyISAM支持

设计原则

1.索引并非越多越好,大量的索引,不仅占用磁盘空间,还会影响INSERT、DELETE、UPDATE等语句的性能,因为在表中的数据更改时,索引也会进行调整和更新
2.避免对经常更新的表进行过多的索引,并且索引中的列要尽可能少。应该对经常用于查询的字段创建索引,但要避免添加不必要的字段
3.数据量小的表最好不要索引,由于数据较少,查询花费的时间可能比遍历索引的时间还要短
4.在不同值较多的列上建立索引,比如性别只有男女两个不同值,无须建立索引
5.当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引需能确保定义的列的数据完整性,以提高查询速度

创建索引的方式

1.在创建表的定义语句中指定索引列
2.使用ALTER TABLE语句创建索引
3.使用CREATE INDEX语句添加索引:CREATE INDEX 索引名 ON 表名(列名)
SHOW INDEX FROM table:查询table表的索引

MySQL 的索引

常用的存储引擎有 MyISAM 和 InnoDB
两者索引结构都是 B+ 树,但 InnoDB 使用的存储方式是聚集索引,每个表有且仅有一个聚集索引。
聚集索引指不仅缓存索引还缓存真实数据。InnoDB 默认使用主键顺序 (可自定义索引)为行记录构建一颗 B+ 树,叶节点以页为单位,存放完整行记录,所有叶节点存放了整张表。
B+ 树 <-> 表,叶子节点 <-> 页
聚集索引的存储并不是物理上连续的,而是逻辑上连续的,叶子结点间按照主键顺序排序,通过双向链表连接。

非聚集索引也称为辅助索引,同样是一棵 B+ 树,通过非聚集索引查找主键,再通过主键 (作为索引)去主键索引内查找行记录。

InnoDB 支持行级锁,事务,外键,热备份和容灾,事务隔离,MVCC 等,适合更新密集的场景

MyISAM 是顺序存储的,B+ 树叶节点存放的是行记录的物理地址,定位速度快,适合查询密集的场景

MySQL 为啥用 B+ 树

不用 hash 表是因为:
1.hash 冲突;2.不支持排序和范围查询

不用二叉搜索树( BST )是因为:
1.不可能一次性把索引全部装入到内存,只能逐一加载索引节点,因此 BST 的 I/O 次数过多,BST 是二叉树,树的高度更高,还存在极端情况的线性高度问题;
2.B+ 树单个节点包含的值越多,相对需要的 I/O 次数就越少
3.B+ 树高度一般为 2-4 层,只需要 2-4 次 I/O

不用红黑树 (平衡二叉搜索树)是因为:
1.虽然红黑树结合了平衡树和 BST,解决了 BST 极端情况下的线性高度问题,但是依然存在着 BST 的缺点
2.红黑树,BST 更适合在内存中使用进行内部查找和排序

不用 B 树是因为:
1.B 树的内节点也会存储 key 和 data,因此平均情况下,B 树的查找效率比 B+ 树更高
2.而 B 树的叶子节点是相互独立的,B+ 树叶子节点有指向相邻节点的指针,因此 B+ 树排序和范围查找的效率更高
3.因此 B 树更适合于做单一查询更多的数据库,如非关系型数据库,而 B+ 树则更适合做排序和范围查询更多的数据库,如关系型数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Freeze.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值