【MySQL】

引擎

1.MySQL存储引擎MyISAM与InnoDB区别

MyISAMInnodb
外键不支持支持
事务不支持支持
SELECTMyISAM更优
INSERT、 UPDATE、 DELETEInnoDB更优

2.存储引擎选择

如果没有特别的需求,使用默认的Innodb即可。

MyISAM:以读写插入为主的应用程序,比如博客系统、新闻门户网站。

Innodb:更新(删除)操作频率也高,或者要保证数据的完整性;并发量高, 支持事务和外键。

索引

1.索引设计的原则

1.1适合索引的列是出现在where子句中的列,或者连接子句中指定的列

1.2基数较小的类,索引效果较差,没有必要在此列建立索引

1.3使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间

1.4不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行 更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。

2.创建索引的原则

2.1符合左前缀匹配原则。左前缀匹配原则是组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、 between、like)就停止匹配

2.2较频繁作为查询条件的字段才去创建索引

2.3更新频繁字段不适合创建索引

2.4若是不能有效区分数据的列不适合做索引列(如性别,男女未知,多也就三种,区分度实在太低)

2.5尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改 原来的索引即可

2.6定义有外键的数据列一定要建立索引

2.7对于定义为text、image和bit 的数据类型的列不要建立索引

3.联合索引是什么?为什么需要注意联合索引中的顺序?

MySQL可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要 按照建立索引时的字段顺序挨个使用,否则无法命中索引。

MySQL使用索引时需要索引有序。假设现在建立了"name,age,school"的联合索引,那么索引的排序 为: 先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进行排序。 当进行查询时,此时索引仅仅按照name严格有序,因此必须首先使用name字段进行等值查询,之后对于匹配到的列而言,其按照age字段严格有序,此时可以使用age字段用做索引查找,以此类推。因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段选择性高的列放在前面。

4.索引失效情况

  • 违反最左前缀法则
  • 在索引列进行范围查找
  • 在索引上进行运算操作
  • 索引列的属性为字符串时,查找时要加单引号
  • 对索引字段进行左模糊查询

SQL优化 

  • 表设计优化,数据类型的选择(能用char就避免用varchar)
  • 索引优化
  • sql语句优化,避免索引失效,避免select *
  • 主从复制,读写分离
  • 分库分表

事务

1.什么是数据库事务?

事务是一个不可分割的数据库操作序列。事务是逻辑上的一组操作,要么都执行,要么都不执行。例如,A、B都拥有100元,A给B100元。结果只有两种,成功则A有200元、B有0元,失败则A、B各100元.

2.事物的四大特性(ACID)

2.1原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作 要么全部完成,要么完全不起作用

2.2一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的 结果是相同的

2.3隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的

2.4持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该 对其有任何影响

3.什么是事务的隔离级别?MySQL的默认隔离级别是什么?

SQL 标准定义了四个隔离级别:

3.1READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

3.2READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

3.3REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

3.4SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

PS:Mysql 默认采用的 REPEATABLE_READ隔离级别;Oracle默认采用的 READ_COMMITTED隔离级别

常用SQL语句

1.SQL语句主要分为哪几类

1.1数据定义语言DDL(Data Ddefinition Language):CREATE,DROP,ALTER 主要为以上操作

1.2数据查询语言DQL(Data Query Language):SELECT

1.3数据操纵语言DML(Data Manipulation Language):INSERT,UPDATE, DELETE

1.4数据控制功能DCL(Data Control Language):GRANT,REVOKE, COMMIT,ROLLBACK

2.SQL约束有哪几种

2.1NOT NULL: 用于控制字段的内容一定不能为空(NULL)

2.2UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束

2.3PRIMARY KEY: 也是用于控件4字段内容不能重复,但它在一个表只允许出现一个

2.4FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向 的那个表中的值之一

3.六种关联查询

3.1交叉连接(CROSS JOIN) 

#没有任何关联条件,结果是笛卡尔积,结果集会很大,没有意义,很少使用内

SELECT * FROM A,B(,C)

OR

SELECT * FROM A CROSS JOIN B (CROSS JOIN C)

3.2 内连接(INNER JOIN)

#等值连接

ON A.id=B.id

#不等值连接

ON A.id > B.id

#自连接

SELECT * FROM A T1 INNER JOIN A T2 ON T1.id=T2.pid

3.3外连接(LEFT JOIN/RIGHT JOIN)

左外连接:LEFT OUTER JOIN, 以左表为主,先查询出左表,按照ON后的关联条件匹配右表,没有匹配到的用NULL填充,可以简写成LEFT JOIN

右外连接:RIGHT OUTER JOIN, 以右表为主,先查询出右表,按照ON后的关联条件匹配左表,没有匹配到的用NULL填充,可以简写成RIGHT JOIN

3.4联合查询(UNION与UNION ALL)

SELECT * FROM A UNION SELECT * FROM B UNION ...

就是把多个结果集集中在一起,UNION前的结果为基准,需要注意的是联合查询的列数要相等,相同的记录行会合并。

如果使用UNION ALL,不会合并重复的记录。

行效率UNION高于UNION ALL。

3.5全连接(FULL JOIN)ps:MySql不支持,Oracle支持

#MySQL不支持全连接 可以使用LEFT JOIN 和UNION和RIGHT JOIN联合使用

SELECT * FROM A LEFT JOIN B ON A.id=B.id UNION SELECT * FROM A RIGHT JOIN B ON A.id=B.id

 4.varchar与char的区别

char:char表示定长字符串,长度是固定的;如果插入数据的长度小于char的固定长度时,则用空格填充; 因为长度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因为其长度固定,所以会占据多 余的空间,是空间换时间的做法; 对于char来说, 多能存放的字符个数为255,和编码无关。

varchar:varchar表示可变长字符串,长度是可变的; 插入的数据是多长,就按照多长来存储; varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间,是时间 换空间的做法; 对于varchar来说, 多能存放的字符个数为65532。

总之,结合性能角度(char更快)和节省磁盘空间角度(varchar更小),具体情况还需具体来设计数据库才是妥当的做法。

  • 41
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sunnxin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值