mysql刷题小记

1、假设KEY test(a,b,c)
(1) order by 能使用索引最左前缀
-order by a
-order by a,b
-order by a,b,c
-order by a asc,b asc,c asc
-order by a desc,b desc,c desc
(2) 如果where使用索引最左前缀定位为常量,则order by可以使用索引
-wherea=constorder by b,c
-where a=constandb=constorder by c
-where a=constand b>consst order by b,c (
3) 不能使用索引进行排序
-order by a asc,b desc, c desc /排序不一致/
-where g=const order by b,c /丢失a索引/
-where a=constorder by c /丢失b索引/
-where a=constorder by a,d /d不是索引一部分/
-where a in (…) order by b,c /对于排序来说,多个相等条件也是范围查询/

转自https://blog.csdn.net/weixin_35952427/article/details/112037911

2、
       关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。
       任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的结果。所以运算对象、运算符、运算结果是运算的三大要素。
       按运算符的不同分为传统的集合运算和专门的关系运算两类:
              传统的集合运算包括:并(∪)、差(−)、交(∩)、笛卡尔积(×)。
              专门的关系运算包括:选择(σ)、投影(π)、连接(⋈)、除运算(÷)。
              在任何一种数据库管理系统中(包括MySQL),投影对应于SELECT子句,选择对应于WHERE子句,连接对应于JOIN子句,但除没有直接的对应语句,需要根据题目的实际含义书写复杂的SQL,通常都会包含子查询。
              (扩:关系代数中五种基本运算分别为:并差 选择 投影和广义笛卡尔积)

3、一个数据库中往往包含多个关系,一个数据库中这些关系的集合称之为(数据库模式)。

4、数据模型所描述的内容包括三个部分,分别是数据结构、数据操作和(数据约束)。

5、MySQL备份工具mysqldump和mysqlhotcopy:

       1)mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,数据库大时,占用系统资源较多,支持常用的MyISAM,innodb引擎;mysqlhotcopy只是简单的缓存写入和文件复制的过程,占用资源和备份速度比mysqldump快很多很多,特别适合大的数据库,但需要注意的是:mysqlhotcopy只支持MyISAM 引擎。

       2)mysqlhotcopy只能运行在数据库目录所在的机器上,mysqldump可以用在远程客户端。

       3)mysqlhotcopy恢复只需要拷贝备份文件到源目录覆盖即可,mysqldump需要导入SQL文件到原来库中。

       4)两者都在线执行lock tables(锁表)以及unlock tables(解锁表)。

(具体参见https://www.cnblogs.com/diantong/p/11022104.html)

6、MySQL的数据类型主要包括以下五大类:

整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT

浮点数类型:FLOAT、DOUBLE、DECIMAL

字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB

日期类型:Date、DateTime、TimeStamp、Time、Year

其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等

7、FOUND_ROWS()与ROW_COUNT():

       FOUND_ROWS()函数返回的是上一条 SELECT 语句(或 SHOW语句等)查询结果集的记录数。

       ROW_COUNT()函数返回的是上一条SQL语句,对表数据进行修改操作后影响的记录数,如果上一条SQL语句不是修改操作语句(INSERT/UPDATE/DELETE 等),而是查询语句(SELECT/SHOW 等)则返回-1,如果是修改操作语句,则返回修改(增/删/该)影响的记录数。

       LAST_INSERT_ID()函数获取主表id自增后,MySQL生成的最后一个插入id的值。该函数是线程安全的。

8、
       sysdate():返回实时的系统日期和时间
       curdate():返回语句执行时的日期
       curtime():返回语句执行时的时间
       now():返回语句执行时的日期和时间

9、视图是一种常用的数据对象,它是提供(查看)和(存放)数据的另一种途径,可以简化数据库操作。

10、
\g的作用和MySQL中的分号”;"是一样的
\G的作用是将查找到的内容结构旋转90度,变成纵向结构

11、当某字段要使用auto_increment的属性时,该字段必须是(int)类型数据,并且该字段还必须是(关键字段或索引字段)。

12、SQL语句在查询之前会使用(查询优化器)对查询进行优化,不是解析器。

13、Oracle和MySQL以不同方式处理临时表:

       在MySQL中,临时表是仅对当前用户会话可见的数据库对象,并且一旦会话结束,这些表将自动删除。

       Oracle中临时表的定义与MySQL略有不同,因为临时表一旦创建就会存在,直到它们被显式删除,并且对具有适当权限的所有会话都可见。但是,临时表中的数据仅对将数据插入表中的用户会话可见,并且数据可能在事务或用户会话期间持续存在。

14、MVCC(多版本并发控制):

       MVCC全称是: Multiversion concurrency control,多版本并发控制,提供并发访问数据库时,对事务内读取的到的内存做处理,用来避免写操作堵塞读操作的并发问题。

       举个例子,程序员A正在读数据库中某些内容,而程序员B正在给这些内容做修改(假设是在一个事务内修改,大概持续10s左右),A在这10s内 则可能看到一个不一致的数据,在B没有提交前,如何让A能够一直读到的数据都是一致的呢?

       有几种处理方法,第一种: 基于锁的并发控制,程序员B开始修改数据时,给这些数据加上锁,程序员A这时再读,就发现读取不了,处于等待情况,只能等B操作完才能读数据,这保证A不会读到一个不一致的数据,但是这个会影响程序的运行效率。

       还有一种就是:MVCC,每个用户连接数据库时,看到的都是某一特定时刻的数据库快照,在B的事务没有提交之前,A始终读到的是某一特定时刻的数据库快照,不会读到B事务中的数据修改情况,直到B事务提交,才会读取B的修改内容。

        一个支持MVCC的数据库,在更新某些数据时,并非使用新数据覆盖旧数据,而是标记旧数据是过时的,同时在其他地方新增一个数据版本。因此,同一份数据有多个版本存储,但只有一个是最新的。
(转自https://www.cnblogs.com/myseries/p/10930910.html)

15、行级锁可以最大程度地支持并发处理,同时也带来了最大的锁开销。

16、MySQL 中有六种日志文件,分别是:

        二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log),中继日志(relay log)、重做日志(redo log)、回滚日志(undo log)。

        1)错误日志:错误日志记录着 mysqld 启动和停止,以及服务器在运行过程中发生的错误及警告相关信息。当数据库意外宕机或发生其他错误时,我们应该去排查错误日志。

        2)慢查询日志:慢查询日志是用来记录执行时间超过 long_query_time 这个变量定义的时长的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。

        3)一般查询日志:又称通用查询日志,是 MySQL 中记录最详细的日志,该日志会记录 mysqld 所有相关操作,当 clients 连接或断开连接时,服务器将信息写入此日志,并记录从 clients 收到的每个 SQL 语句。当你怀疑 client 中的错误并想要确切知道 client 发送给mysqld的内容时,通用查询日志非常有用。

        4)二进制日志:记录了数据库所有执行的DDL和DML语句(除了数据查询语句select、show等),以事件形式记录并保存在二进制文件中。常用于数据恢复和主从复制。

17、主从复制
        将主数据库中的DDL和DML操作通过二进制日志传输到从数据库上,然后将这些日志重新执行(重做),从而使得从数据库的数据与主数据库保持一致。
在这里插入图片描述
Binary log:主数据库的二进制日志。

Relay log:从服务器的中继日志。

第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中。

第二步:salve开启一个I/O Thread,该线程在master打开一个普通连接,主要工作是binlog dump process。如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。I/O线程最终的目的是将这些事件写入到中继日志中。

第三步:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致。

(转自https://www.cnblogs.com/cocoxu1992/p/10670589.html)

18、MySQL数据库的两种连接方式:TCP/IP和Socket

19、关于BLOB和TEXT正确的是(ABD)
       A. BLOB是一个二进制对象,可以容纳可变数量的数据
       B. TEXT是一个不区分大小写的BLOB
       C. 进行排序和比较时,对TEXT值区分大小写
       D. 进行排序和比较时,对BLOB值区分大小写

20、锁的优化策略包含以下(ABD)
       A. 读写分离
       B. 分段加锁
       C. 多个线程尽量以不同的顺序去获取资源
       D. 减少锁持有的时间

21、存储过程
1)创建存储过程

CREATE PROCEDURE  存储过程名 (参数列表)
BEGIN
    SQL语句代码块
END

其中参数列表形式为:

[IN|OUT|INOUT] param_name type

其中in表示输入参数,out表示输出参数,inout表示既可以输入也可以输出;param_name表示参数名称;type表示参数的类型,该类型可以是MYSQL数据库中的任意类型。

例子:

DROP PROCEDURE IF EXISTS sp_test;

DELIMITER //
CREATE PROCEDURE sp_test()
BEGIN
    SELECT * FROM tb_user;
END //
DELIMITER ;

"DELIMITER //"语句的作用是设置MySQL的结束符。为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER 改变存储过程的结束符,并以"END //"结束存储过程。存储过程定义完毕之后再使用"DELIMITER ;"恢复默认结束符。

2)删除存储过程

DROP PROCEDURE  IF  EXISTS  存储过程名;

3)调用存储过程

CALL 存储过程名(参数列表);

(具体参考https://www.cnblogs.com/xiaoxi/p/6398347.html)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值