上期小编给大家汇总介绍了mysql的6个基础的知识点,下面继续给大家分享一下另外7个知识点:
7、什么是死锁?怎么解决?
死锁:两个或多个事务相互占用了对方的锁,就会一直处于等待的状态。
常见的解决死锁的方法:
(1)、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
(2)、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
(3)、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
如果业务处理不好可以用分布式事务锁或者使用乐观锁
8、多版本并发控制
MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于并发性能的考虑,他们一般都同时实现了多版本并发控制(MVCC),不仅MySQL,包括Oracale、PostgreSQL等其他数据库都各自实现了MVCC,但基于实现的机制不尽相同,因为MVCC没有一个统一的标准。InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,一个是创建时间,一个是系统版本号。每开始一个新的事物,系统版本号会自动递增。
9、char和varchar的区别?
varchar是变长,char是定长
varchar占用空间更多,会多出一个字节来储存字符长度,超过255个字符使用两个字节
char无碎片,varchar经常更新会造成碎片
10、MySQL性能优化
表结构优化:数据类型的选择通常更小的最好,尽量避免NULL,表字段不宜太多,有时候反范式设计会带来性能的提升。
经常查询的列建立索引
索引列的基数越大,数据区分度越高,索引的效果越好。
对于字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间。
根据情况创建联合索引,联合索引可以提高查询效率。
避免创建过多的索引,索引会额外占用磁盘空间,降低写操作效率。
访问数据太多导致查询性能下降
确定应用程序是否在检索大量超过需要的数据,可能是太多行或列
确认MySQL服务器是否在分析大量不必要的数据行
避免犯如下SQL语句错误
查询不需要的数据。解决办法:使用limit解决
多表关联返回全部列。解决办法:指定列名
总是返回全部列。解决办法:避免使用SELECT *
重复查询相同的数据。解决办法:可以缓存数据,下次直接读取缓存
是否在扫描额外的记录。解决办法:
使用explain进行分析,如果发现查询需要扫描大量的数据,但只返回少数的行,可以通过如下技巧去优化:
使用索引覆盖扫描,把所有的列都放到索引中,这样存储引擎不需要回表获取对应行就可以返回结果。
改变数据库和表的结构,修改数据表范式
重写SQL语句,让优化器可以以更优的方式执行查询。
确定ON或者USING子句中是否有索引。
确保GROUP BY和ORDER BY只有一个表中的列,这样MySQL才有可能使用索引。
LIMIT偏移量大的时候,查询效率较低
可以记录上次查询的最大ID,下次查询时直接根据该ID来查询
11、IN和exists的使用?
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当exists里的条件语句能够返回纪录行时
(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的到这条纪录,反之如果exists里的条 件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件,当能返回结果集则为true,不能返回结果集则为 false
in查询相当于多个or条件的叠加,这个比较好理解,比如下面的查询
select * from A where cc in (select cc from B),用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=http://A.cc) ,用到了B表上cc列的索引。
12、什么是交叉链接、内链接、外链接?
内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的连接表就是数据库在做查询形成的中间表)
外连接(OUTER JOIN):外连接分为左连接或左外连接、右连接或者右外连接、全连接或全外连接。我们简单的就叫:左连接,右连接和全连接
左外连接:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值
select t.teacher_name, s.student_name from teacher t, student s where t.id= s.teacher_id(+);
右外连接:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值
select t.teacher_name, s.student_name from teacher t, student s where t.id(+) = s.teacher_id;
全外连接:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值
交叉连接(CROSS JOIN):也称笛卡儿积。
概念:不带WHERE条件句,它将会返回被连接的两个表的笛卡儿积,返回结果的行数等于两个表行数的乘积
13、SQL语句关键字的执行顺序
FROM:对FROM子句中的左表和又表执行笛卡尔积,产生虚拟表VT1。
ON:对虚拟表T1应用ON筛选,只有那些符合条件的行才被插入虚拟表VT2。
JOIN:如果指定了OUTER JOIN ,那么保留表中未匹配的行作为外部行添加到虚拟表VT2中,产生虚拟表VT3,。如果FROM子句包含两个以上表,则对上一个连接生成的VT3和下一个表重复执行步骤1-步骤3,直到处理完表为止。
WHERE:对虚拟表VT3应用WHERE条件筛选,只有符合条件的行才被插入到虚拟表VT4中。
GROUP BY:根据GROUP BY子句中的列,对VT4中的记录进行分组操作,产生虚拟表VT5。
CUBE|ROLLUP:对虚拟表VT5进行CUBE或ROLLUP操作,产生虚拟表VT6。
HAVING:对虚拟表VT6应用HAVING过滤器,只有符合条件的记录才被插入虚拟表VT7。
SELECT:第二次执行SELECT操作,选择指定的列,插入到虚拟表VT8中。
DISTINCT:去除重复的数据,产生虚拟表VT9。
ORDER BY:将虚拟表VT9中的记录按照字段进行排序操作产生虚拟表VT10.
LIMIT:取出指定行的记录,产生虚拟表VT11,并返回给查询用户。
睿江云官网链接:www.eflycloud.com