面試題之数据库

- 引擎
            - innodb
                - 事务
                - 行锁/表锁
                    - 表锁:
                        select * from tb for update;
                    - 行锁:
                        select id,name from tb where id=2 for update ;
            - myisam
                - 全文索引
                -- 表锁
                    - select * from tb for update;

索引

- 索引: B+/哈希索引   =》 查找速度快;更新速度慢
            单列:
                - 普通索引:加速查找
                - 唯一索引: 加速查找 + 约束:不能重复
                -    主键: 加速查找 + 约束:不能重复 + 不能为空
            多列:
                - 联合索引
                - 联合唯一索引
                PS:遵循最左前缀的规则
            其他词语:
                - 索引合并,利用多个单例索引查询,根据这两个索引来查询,没有联合索引快;
                - 覆盖索引,在索引表中就能将想要的数据查询到;
  

- 创建了索引,应该如何命中索引
  那种情况下,创建了无法命中索引?记住!!!!!
- like '%xx' select * from tb1 where name like '%cn'; - 使用函数 select * from tb1 where reverse(name) = 'wupeiqi'; - or select * from tb1 where nid = 1 or email = 'seven@live.com'; 特别的:当or条件中有未建立索引的列才失效,以下会走索引 select * from tb1 where nid = 1 or name = 'seven'; select * from tb1 where nid = 1 or email = 'seven@live.com' and name = 'alex' - 类型不一致 如果列是字符串类型,传入条件是必须用引号引起来,不然... select * from tb1 where name = 999; - != select * from tb1 where name != 'alex' 特别的:如果是主键,则还是会走索引 select * from tb1 where nid != 123 - > select * from tb1 where name > 'alex' 特别的:如果是主键或索引是整数类型,则还是会走索引 select * from tb1 where nid > 123 select * from tb1 where num > 123 - order by select email from tb1 order by name desc; 当根据索引排序时候,选择的映射如果不是索引,则不走索引 特别的:如果对主键排序,则还是走索引: select * from tb1 order by nid desc; - 组合索引最左前缀 如果组合索引为:(name,email) name and email -- 使用索引 name -- 使用索引 email -- 这样查询不能使用索引 补充查询优化方案: a.不用select * b.固定长度的字段放在最前边, c.char(固定长度)和varchar(不固定长度) d.联合索引最左前缀
         e.固定数据放内存中(访问频率高的数据,提高访问查询速度)
         F.读写分离,创建一个主从表, 读从 从表中,写写到主表, 定期往从表中写入数据
      
         g.分库,表很多的时候放在不同的库中去,(注意要知道那个库中有哪些表, 连表查询的时候也有代价)
            -水平分表,将某些列拆分到一张表中去 例如 博客,博客详情
            -垂直分表,将历史信息分到另外一张表中,例如 账单(最近账单和年代久远的账单)
        h.缓存:将常数据利用redis memcach

数据库分页

        
        - 数据库分页   :存在问题  越往后查询越慢,因为他是从开头到页码遍历一遍
            select * form tb limit 10 offset 0
            select * form tb limit 10 offset 10
            select * form tb limit 10 offset 20
            select * form tb limit 10 offset 30
            ...
            select * form tb limit 10 offset 3000000
            解决方案::
            答案一:
                先查主键,在分页。
                select * from tb where id in (
                    select id from tb where limit 10 offset 30
                )
            答案二  常用:
                按照也无需求是否可以设置只让用户看200页
                
            答案三  常用:
                记录当前页  数据ID最大值和最小值
                在翻页时,根据条件先进行筛选;筛选完毕之后,再根据limit offset 查询。
                
                select * from (select * from tb where id > 22222222) as B limit 10 offset 0
                
                如果用户自己修改页码,也可能导致慢;此时对url种的页码进行加密(rest framework )。
                
            答案四:
                当数据库很大,但是如果只是想获取一条数据
                select * form User where name="alex" limit 1

概念

- 概念:
            - 触发器
            - 函数
                - 聚合:max/sum/min/avg
                - 时间格式化 date_format
                - 字符串拼接 concat
            - 存储过程
            以上内容都是保存在数据库中。

- 看-看:

            - 如何开启慢日志查询? 是用于查询那个sql语句慢
        开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。 >>点我 slow_query_log
= ON 是否开启慢日志记录 long_query_time = 2 时间限制,超过此时间,则记录 slow_query_log_file = /usr/slow.log 日志文件 log_queries_not_using_indexes = ON 为使用索引的搜索是否记录 - 执行计划
           explain select
* from tb; - 导入和导出
- 导入和导出
导出现有数据库数据:

mysqldump -u用户名 -p密码 数据库名称 >导出文件路径           # 结构+数据
mysqldump -u用户名 -p密码 -d 数据库名称 >导出文件路径       # 结构 
导入现有数据库数据:

mysqldump -uroot -p密码  数据库名称 < 文件路径  

      
原文地址:https://www.cnblogs.com/wangkun122/p/9022886.html