varchar是变长而char的长度是固定的。若是你的内容是固定大小的,你会获得更好的性能。
DELETE命令从一个表中删除某一行,或多行,TRUNCATE命令永久地从表中删除每一行。
触发器是指一段代码,当触发某个事件时,自动执行这些代码。在MySQL数据库中有以下六种触发器:1.Before Insert2.After Insert3.Before Update4.After Update5.Before Delete6.After Delete
int(0)表示数据是INT类型,长度是0、char(16)表示固定长度字符串,长度为1六、varchar(16)表示可变长度字符串,长度为1六、datetime表示时间类型、text表示字符串类型,能存储大字符串,最多存储65535字节数据)
- InnoDB支持事务,MyISAM不支持;
- InnoDB数据存储在共享表空间,MyISAM数据存储在文件中;
- InnoDB支持行级锁,MyISAM只支持表锁;
- InnoDB支持崩溃后的恢复,MyISAM不支持;
- InnoDB支持外键,MyISAM不支持;
- InnoDB不支持全文索引,MyISAM支持全文索引;
一、插入缓冲(insert buffer)二、二次写(double write)三、自适应哈希索引(ahi)四、预读(read ahead)
InnoDB、MyISAM、Memory
- varchar可指定字符数,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
- text类型不能有默认值。
- varchar可直接建立索引,text建立索引要指定前多少个字符。varchar查询速度快于text,在都建立索引的状况下,text的索引几乎不起做用。
- 查询text须要建立临时表。
最多存放50个字符,varchar(50)和(200)存储hello所占空间同样,但后者在排序时会消耗更多内存,由于order by col采用fixed_length计算col长度(memory引擎也同样)。
是指显示字符的长度,不影响内部存储,只是当定义了ZEROFILL时,前面补多少个 0
- 一个表只能有一个主键索引,可是能够有多个惟一索引。
- 主键索引必定是惟一索引,惟一索引不是主键索引。
- 主键能够与外键构成参照完整性约束,防止数据不一致。
- 联合索引:将多个列组合在一块儿建立索引,能够覆盖多个列。(也叫复合索引,组合索引)
- 外键索引:只有InnoDB类型的表才可使用外键索引,保证数据的一致性、完整性、和实现级联操做(基本不用)。
- 全文索引:MySQL自带的全文索引只能用于MyISAM,而且只能对英文进行全文检索 (基本不用)
需遵循前缀原则
在MySQL里NULL值的列也是走索引的。固然,若是计划对列进行索引,就要尽可能避免把它设置为可空,MySQL难以优化引用了可空列的查询,它会使索引、索引统计和值更加复杂。
不会,由于只要列涉及到运算,MySQL就不会使用索引。
MyISAM存储引擎使用B+Tree做为索引结构,叶节点的data域存放的是数据记录的地址。MyISAM的索引方式也叫作非聚簇索引的,之因此这么称呼是为了与InnoDB的聚簇索引区分。
- InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
- InnoDB的主键索引的叶子节点存储着行数据,所以主键索引很是高效。
- MyISAM索引的叶子节点存储的是行数据地址,须要再寻址一次才能获得数据。
- InnoDB非主键索引的叶子节点存储的是主键和其余带索引的列数据,所以查询时作到覆盖索引会很是高效。
六种关联查询1.交叉链接(CROSS JOIN)2.内链接(INNER JOIN)3.外链接(LEFT JOIN/RIGHT JOIN)4.联合查询(UNION与UNION ALL)5.全链接(FULL JOIN)6.交叉链接(CROSS JOIN)
内链接分为三类面试
- 等值链接:ON A.id=B.id
- 不等值链接:ON A.id > B.id
- 自链接:SELECT * FROM A T1 INNER JOIN A T2 ON T1.id=T2.pid
外链接(LEFT JOIN/RIGHT JOIN)sql
- 左外链接:LEFT OUTER JOIN, 以左表为主,先查询出左表,按照ON后的关联条件匹配右表,没有匹配到的用NULL填充,能够简写成LEFT JOIN
- 右外链接:RIGHT OUTER JOIN, 以右表为主,先查询出右表,按照ON后的关联条件匹配左表,没有匹配到的用NULL填充,能够简写成RIGHT JOIN
联合查询(UNION与UNION ALL)数据库
- 就是把多个结果集集中在一块儿,UNION前的结果为基准,须要注意的是联合查询的列数要相等,相同的记录行会合并
- 若是使用UNION ALL,不会合并重复的记录行3.效率 UNION 高于 UNION ALL
全链接(FULL JOIN)缓存
1.MySQL不支持全链接2.可使用LEFT JOIN 和UNION和RIGHT JOIN联合使用
嵌套查询服务器
用一条SQL语句得结果做为另一条SQL语句得条件,效率很差把握
解题方法函数
根据考题要搞清楚表的结果和多表之间的关系,根据想要的结果思考使用那种关联方式,一般把要查询的列先写出来,而后分析这些列都属于哪些表,才考虑使用关联查询
- 若是使用UNION ALL,不会合并重复的记录行
- 效率 UNION 高于 UNION ALL
1.若是A表TID是自增加,而且是连续的,B表的ID为索引工具
2.若是A表的TID不是连续的,那么就须要使用覆盖索引.TID要么是主键,要么是辅助索引,B表ID也须要有索引。性能
考点分析:优化
这道题主要考察的是查找分析SQL语句查询速度慢的方法
延伸考点:spa
- 优化查询过程当中的数据访问
- 优化长难的查询语句
- 优化特定类型的查询语句
如何查找查询速度慢的缘由
记录慢查询日志,分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和精力,可使用pt-query-digest工具进行分析
使用show profile
使用show status
show status会返回一些计数器,show global status会查看全部服务器级别的全部计数有时根据这些计数,能够推测出哪些操做代价较高或者消耗时间多
show processlist
观察是否有大量线程处于不正常的状态或特征
最常问的MySQL面试题五——每一个开发人员都应该知道
使用explain
分析单条SQL语句
优化查询过程当中的数据访问
- 访问数据太多致使查询性能降低
- 肯定应用程序是否在检索大量超过须要的数据,多是太多行或列
- 确认MySQL服务器是否在分析大量没必要要的数据行
- 避免犯以下SQL语句错误
- 查询不须要的数据。解决办法:使用limit解决
- 多表关联返回所有列。解决办法:指定列名
- 老是返回所有列。解决办法:避免使用SELECT *
- 重复查询相同的数据。解决办法:能够缓存数据,下次直接读取缓存
- 是否在扫描额外的记录。解决办法:使用explain进行分析,若是发现查询须要扫描大量的数据,但只返回少数的行,能够经过以下技巧去优化:
- 使用索引覆盖扫描,把全部的列都放到索引中,这样存储引擎不须要回表获取对应行就能够返回结果。
- 改变数据库和表的结构,修改数据表范式
- 重写SQL语句,让优化器能够以更优的方式执行查询。
优化长难的查询语句
- 一个复杂查询仍是多个简单查询
- MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多使用尽量小的查询是好的,可是有时将一个大的查询分解为多个小的查询是颇有必要的。
- 切分查询
- 将一个大的查询分为多个小的相同的查询
- 一次性删除1000万的数据要比一次删除1万,暂停一会的方案更加损耗服务器开销。
- 分解关联查询,让缓存的效率更高。
- 执行单个查询能够减小锁的竞争。
- 在应用层作关联更容易对数据库进行拆分。
- 查询效率会有大幅提高。
- 较少冗余记录的查询。
优化特定类型的查询语句
- count(*)会忽略全部的列,直接统计全部列数,不要使用count(列名)
- MyISAM中,没有任何where条件的count(*)很是快。
- 当有where条件时,MyISAM的count统计不必定比其它引擎快。
- 可使用explain查询近似值,用近似值替代count(*)
- 增长汇总表
- 使用缓存
优化关联查询
- 肯定ON或者USING子句中是否有索引。
- 确保GROUP BY和ORDER BY只有一个表中的列,这样MySQL才有可能使用索引。
优化子查询
- 用关联查询替代
- 优化GROUP BY和DISTINCT
- 这两种查询据可使用索引来优化,是最有效的优化方法
- 关联查询中,使用标识列分组的效率更高
- 若是不须要ORDER BY,进行GROUP BY时加ORDER BY NULL,MySQL不会再进行文件排序。
- WITH ROLLUP超级聚合,能够挪到应用程序处理
优化LIMIT分页
- LIMIT偏移量大的时候,查询效率较低
- 能够记录上次查询的最大ID,下次查询时直接根据该ID来查询
优化UNION查询
UNION ALL的效率高于UNION
优化WHERE子句
解题方法对于此类考题,先说明如何定位低效SQL语句,而后根据SQL语句可能低效的缘由作排查,先从索引着手,若是索引没有问题,考虑以上几个方面,数据访问的问题,长难查询句的问题仍是一些特定类型优化的问题,逐一回答。
1.对查询进行优化,应尽可能避免全表扫描,首先应考虑在 where 及 order by 涉及的列上创建索引。
2.应尽可能避免在 where 子句中对字段进行 null 值判断,不然将致使引擎放弃使用索引而进行全表扫描,如:
3.应尽可能避免在 where 子句中使用!=或<>操做符,不然引擎将放弃使用索引而进行全表扫描。
4.应尽可能避免在 where 子句中使用or 来链接条件,不然将致使引擎放弃使用索引而进行全表扫描,如:
5.in 和 not in 也要慎用,不然会致使全表扫描,如:
6.下面的查询也将致使全表扫描:select id from t where name like ‘%李%’若要提升效率,能够考虑全文检索。
7.若是在 where 子句中使用参数,也会致使全表扫描。由于SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,若是在编译时创建访问计划,变量的值仍是未知的,于是没法做为索引选择的输入项。以下面语句将进行全表扫描:
8.应尽可能避免在 where 子句中对字段进行表达式操做,这将致使引擎放弃使用索引而进行全表扫描。如:
9.应尽可能避免在where子句中对字段进行函数操做,这将致使引擎放弃使用索引而进行全表扫描。如:
10.不要在 where 子句中的“=”左边进行函数、算术运算或其余表达式运算,不然系统将可能没法正确使用索引。
但愿这些Mysql常见的题可以给在求职路上的你一些帮助,同时也帮你们整理了部分的答案和更多的面试题给你们,但愿你们在面试的时候也可以用到。