列的字符串类型可以是什么?
SET BLOB ENUM CHAR TEXT VARCHAR
date,datetime,time和timestamp数据类型有什么区别
date,datetime,time 区别在于精度:日期,日期+时间,时间
timestamp和datetime的相同点: 两者都可用来表示YYYY-MM-DD HH:MM:SS类型的日期,DateTime和TimeStamp都可以精确到毫秒
对于TIMESTAMP,它把客户端插入的时间从当前时区转化为**UTC(世界标准时间)**进行存储。查询时,将其又转化为客户端当前时区进行返回。
而对于DATETIME,不做任何改变,基本上是原样输入和输出。
两者所能存储的时间范围不一样
timestamp所能存储的时间范围为:'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999'。
datetime所能存储的时间范围为:'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。
MySQL 数据库服务器性能分析的方法命令有哪些?
show status
Show session status
show profile
show processlist
LIKE 和 REGEXP 操作有什么区别?
LIKE 和 REGEXP 运算符用于表示 ^ 和%。
SELECT * FROM
SELECT * FROM
BLOB 和 TEXT 有什么区别?
BLOB 是一个二进制对象,可以容纳可变数量的数据。有四种类型的 BLOB :TINYBLOB ,BLOB ,MEDIUMBLOB ,LONGBLOB ,它们只能在所能容纳价值的最大长度上有所不同。
TEXT是 以文本方式存储的,如果存储英文的话区分大小写
Blob是以二进制方式存储的,不区分大小写
MySQL 表中允许有多少个TRIGGERS?
在 MySQL 表中允许有六个触发器,如下: BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE and
AFTER DELETE
什么是通用 SQL 函数?
数学函数
Abs(num)求绝对值
floor(num)向下取整
ceil(num)向上取整
字符串函数
insert (s1,index,length,s2) 替换函数
o S1 表示被替换的字符串
o s2 表示将要替换的字符串
o Index 表示被替换的位置, 从 1 开始
o Length 表示被替换的长度
upper(str),ucase(str)将字母改为大写
lower(str),lcase(str)将字母改为小写
left(str,length)返回 str 字符串的前 length 个字符
right(str,length)返回 str 字符串的后 length 个字符
substring(str,index,length)返回 str 字符串从 index 位开始长度为 length 个字符(index 从 1 开始)
reverse(str)将 str 字符串倒序输出
日期函数
curdate()、current_date( ) 获取当前日期
curtime()、current_time( ) 获取当前日期
now()获取当前日期和时间
datediff(d1、d2)d1 和 d2 之间的天数差
adddate(date,num)返回 date 日期开始,之后 num 天的日期
subdate(date,num)返回 date 日期开始,之前 num 天的日期
聚合函数
Count(字段)根据某个字段统计总记录数(当前数据库保存到多少条数据)
sum(字段)计算某个字段的数值总和
avg(字段)计算某个字段的数值的平均值
Max(字段)、min(字段)求某个字段最大或最小值
UNION and UNION ALL
UNION 从两个互不关联的表中返回数据,这就意味着不会出现重复的行,同时也必须对数据进行排序.
UNION ALL 可以大大加快速度,如果你已经知道你的数据不会包括重复行,UNION ALL 不会进行排序
truncate delete drop 的区别
**drop(DDL 语句):**是不可逆操作,会将表所占用空间全部释放掉;
**truncate(DDL 语句):**只针对于删除表的操作,在删除过程中不会激活与表有关的删除触发器并且不会把删除记录放在日志中;当表被 truncate 后,这个表和索引会恢复到初始大小;
**delete(DML 语句):**可以删除表也可以删除行,但是删除记录会被计入日志保存,而且表空间大小不会恢复到原来;
utf8和utf8mb4的区别
Mysql的utf8编码并不是真正的UTF-8编码,Mysql的utf8最多只支持3个字节,而emoji表情、一些特殊的中文字符则需要4个字节才能存储, 因此才会报错。
mysql在**MySQL 5.6+**版本之后支持4Bytes字节(utf8mb4)的存储,Mysql中的utf8mb4是原先utf8只能存储3个字节大小的字符的一种补充,是一种真正的UTF-8编码。
数据库死锁机制和解决⽅方案:
处理理机制:解决死锁最有⽤最简单的方法是不要有等待,将任何等待都转化为回滚,并且事务重新开始。但是有可能影响并发性能。
1、超时回滚,innodb_lock_wait_time设置超时时间;
2、wait-for-graph⽅法:跟超时回滚比起来,这是⼀种更加主动的死锁检测方式。InnoDB引擎也采用这种⽅式。
自增ID
一张表,里面有ID 自增主键,当insert 了17 条记录之后,删除了第15,16,17 条记录,再把Mysql 重启,再insert 一条记录,这条记录的ID 是18 还是15 ?
如果是myisam则是18,因为会把最大ID存储在数据文件中。
如果是InnoDB则是15,把最大ID存储在内存中,重启之后丢失。
优点:自动生成、唯一性,避免表的数据碎片问题,提高数据查询及读取性能。缺点:可预测、不可复用,不适用于分布式环境。对于高并发的负载,innodb在按主键进行插入的时候会造成明显的锁争用,主键的上界会成为争抢的热点,因为所有的插入都发生在这里,并发插入会导致间隙锁竞争。Auto_Increment锁机制会造成自增锁的抢夺,有一定的性能损失。
如果主键为自增 id 的话,MySQL 在写满一个数据页的时候,直接申请另一个新数据页接着写就可以了。如果主键是非自增 id,为了确保索引有序,MySQL 就需要将每次插入的数据都放到合适的位置上。当往一个快满或已满的数据页中插入数据时,新插入的数据会将数据页写满,MySQL 就需要申请新的数据页,并且把上个数据页中的部分数据挪到新的数据页上。这就造成了页分裂,这个大量移动数据的过程是会严重影响插入效率的。自增id 可以保证每次插入时B+索引是从右边扩展的,可以避免B+树频繁合并和分裂(对比使用UUID而言)。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。
使用mysql8自带的uuid_to_bin
可以方便的将时间相关的字符高低位进行互换,从而解决了这个性能上的问题。在通过 UUID()函数
生成的uuid值中,若将时间高低位互换,则时间就是单调递增的了 ,也就变得单调递增了。MySQL 8.0还解决了UUID存在的空间占用的问题,除去了UUID字符串中无意义的"-"字符串,并且将字符串用二进制类型保存,这样存储空间降低为了16字节
。
不适合以自增ID主键作为主键的情况:
- 数据量多需要分库分表,可能会造成ID重复
- 经常会遇到数据迁移的情况
- 新数据需要和老数据进行合并
当自增ID用完之后,如果定义了主键:如果您的表使用INT数据类型,最大值为2147483647,如果自增ID的值已经达到这个最大值,那么MySQL将无法再生成新的自增ID,这时您将无法插入新的记录。如果未定义主键:InnoDB 会给你创建一个不可见的,长度为 6 个字节的 row_id。在代码实现时 row_id 是一个长度为8字节的无符号长整型 (bigint unsigned)。但是,InnoDB 在设计时,给 row_id 留的只是 6 个字节的长度,这样写到数据表中时只放了最后 6 个字节。
- row_id 写入表中的值范围,是从 0 到 2^48-1;
- 当 dict_sys.row_id=2^48时,如果再有插入数据的行为要来申请 row_id,拿到以后再取最后 6 个字节的话就是 0。
外部临时表
通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭。这种临时表的命名与非临时表可以同名(同名后非临时表将对当前会话不可见,直到临时表被删除)。