校招总结:数据库(MySQL)

索引

MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Query optimization)。高性能索引策略主要属于结构优化范畴。

校招总结:数据库(MySQL)_第1张图片
索引分类

  • 相关文章
  • MySQL索引背后的数据结构及算法原理:
    原理和算法讲的不错
    http://blog.codinglabs.org/articles/theory-of-mysql-index.html
  • mysql索引总结----mysql 索引类型以及创建:
    创建的SQL语句给的比较全
    http://blog.csdn.net/xluren/article/details/32746183
  • MySQL索引原理及慢查询优化:
    b+树的性质讲的很好
    索引的最左匹配特性
    http://blog.jobbole.com/86594/
    注:用到了explain命令(http://www.cnblogs.com/xuanzhi201111/p/4175635.html)
  • 聚集索引、非聚集索引、非聚集唯一索引:
    三者区别讲的很明白
    http://www.mashangpiao.net/Article/Content/31
  • InnoDB引擎索引学习笔记:
    尽可能做到覆盖索引(即where,order by中用到的字段被索引覆盖),能利用索引加速搜索 和排序
    最后举的实例很好懂
    http://hbprotoss.github.io/posts/innodbyin-qing-suo-yin-xue-xi-bi-ji.html#
  • MySQL索引实现原理及相关优化策略
    优化策略(3点)讲的挺好,有例子好懂
    尤其是为什么要选择列区分度大的做索引
    http://haitian299.github.io/2016/05/20/mysql-index-and-optimizing/
  • 覆盖索引讲的比较好:
    http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html
  • 复合索引创建实例:
    选取哪几列建索引的过程很清楚
    http://www.housong.net/book-ch02-10.html
  • 索引失效相关:
    http://www.360doc.com/content/12/0704/16/3112151_222228086.shtml
    http://itindex.net/detail/52541-sql-%E7%B4%A2%E5%BC%95-%E5%88%86%E6%9E%90
  • b树索引和散列索引的区别:
    为什么用b树索引而不用散列索引
    http://blog.sina.com.cn/s/blog_6776884e0100pko1.html
    http://imysql.com/2016/01/06/mysql-faq-different-between-btree-and-hash-index.shtml

  • 使用索引
    MATCH (col1,col2,...) AGAINST (expr).
    查询要使用索引最重要的条件是查询条件中需要使用索引。
    下列几种情况下有可能使用到索引:

    • 1,对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。
    • 2,对于使用like的查询,后面如果是常量并且只有%不在第一个字符,索引才可能被使用。
    • 3,如果使用column_name is null将使用索引。

    下列的表将不使用索引:

    • 1,如果条件中有or,即使其中有条件有索引也不会使用。
    • 2,对于多列索引,不是使用的第一部分,则不会使用索引。
    • 3,like查询是以%开头
    • 4,如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引。
    • 5,如果mysql估计使用全表扫描要比使用索引快,则不使用索引。

查看索引的使用情况:
show status like ‘Handler_read%’;
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。
handler_read_rnd_next:这个值越高,说明查询低效。

  • 使用索引的注意点:


    校招总结:数据库(MySQL)_第2张图片
    索引使用的注意点

表&三范式

  • 文章
  • 数据中设计中的范式与反范式:
    http://www.kancloud.cn/thinkphp/mysql-design-optimalize/39324
  • 数据库一些知识点小结:
    http://xsk.tehon.org/den/index.php/category/tech/college-knowledge-database-principles.html
  • 考虑用3NF的好处:
    • 3NF定义:第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主键字段。就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放(能尽量外键join就用外键join)。

如果不遵守第三范式,当数据经常更新的时候,就会很麻烦,要改很多地方。而不经常修改的表,比如报表和日志记录,字段很多,生成一次一般就不会再修改了,那么可以做数据冗余,满足第二范式即可。

  • 反三范式:

没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,减少了查询时的关联,提高查询效率,因为在数据库的操作中查询的比例要远远大于DML的比例。但是反范式化一定要适度,并且在原本已满足三范式的基础上再做调整的。


表的优化

  • 相关文章:
    表的优化:
    包含内容很多,如读写分离、拆分表等
    http://www.cnblogs.com/zhuyibo/p/3972061.html
    注:这个作者数据库优化也有系列文章:很高质量,见下:
    http://www.cnblogs.com/zhuyibo/category/612438.html

数据库表的分割:

  • 相关文章:
    • 数据库表分割技术浅析(水平分割/垂直分割/库表散列):
      各种分割讲的很直观好懂、优缺点明确
      http://www.niubua.com/2014/12/06/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8%E5%88%86%E5%89%B2%E6%8A%80%E6%9C%AF%E6%B5%85%E6%9E%90%E6%B0%B4%E5%B9%B3%E5%88%86%E5%89%B2%E5%9E%82%E7%9B%B4%E5%88%86%E5%89%B2%E5%BA%93%E8%A1%A8%E6%95%A3/
  • mysql优化之数据库表设计优化:
    这个作者有一个MySQL优化的系列,可以全看!!
    http://www.jianshu.com/p/be641903845c

SQL语句的优化

  • MySQL的语句执行顺序
    重要,这里自己老迷糊
    http://www.jellythink.com/archives/924
  • 相关文章:
  • SQL语句优化:
    包括 select、delete、update、insert、延迟更新
    http://www.cnblogs.com/zhuyibo/p/3972066.html

缓存参数优化

  • 相关文章:
  • 缓存设置的优化:
    表缓存、查询缓存、索引缓存、插入缓存、日志缓存等
    http://www.cnblogs.com/zhuyibo/p/3972073.html

关于慢查询:

-相关文章:

  • 详解慢查询:
    慢查询的分析过程比较好
    http://www.kancloud.cn/thinkphp/mysql-design-optimalize/39320
  • 慢查询分析与优化:
    自造了一个慢查询
    http://zone.gaospot.com/2016/05/18/Mysql%E6%85%A2%E6%9F%A5%E8%AF%A2%E5%88%86%E6%9E%90%E4%B8%8E%E4%BC%98%E5%8C%96/

sql语句应该考虑哪些安全性?####

答:
(1)防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量。
sql注入攻击实例及理解:http://blog.jobbole.com/83092/
(2)最小权限原则,特别是不要用root账户,为不同的类型的动作或者组建使用不同的账户。
(3)当sql运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄漏服务器和数据库相关信息。


****简单描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响。****
答:
(1)索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
(2)普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。
(3)普通索引允许被索引的数据列包含重复的值,如果能确定某个数据列只包含彼此各不相同的值,在为这个数据索引创建索引的时候就应该用关键字UNIQE把它定义为一个唯一所以,唯一索引可以保证数据记录的唯一性。
(4)主键,一种特殊的唯一索引,在一张表中只能定义一个主键索引,逐渐用于唯一标识一条记录,是用关键字PRIMARY KEY来创建。
(5)索引可以覆盖多个数据列,如像INDEX索引,这就是联合索引。
(6)索引可以极大的提高数据的查询速度,但是会降低插入删除更新表的速度,因为在执行这些写操作时,还要操作索引文件。


****一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 ?****
答:
(1)如果表的类型是MyISAM,那么是18。因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失。
(2)如果表的类型是InnoDB,那么是15。InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失。


****请简述项目中优化sql语句执行效率的方法,从哪些方面。sql语句性能如何分析?****
答:
(1)尽量选择较小的列
(2)将where中用的比较频繁的字段建立索引
(3)select子句中避免使用‘*’
(4)避免在索引列上使用计算,not,in和<>等操作
(5)当只需要一行数据的时候使用limit 1
(6)保证表单数据不超过200w,适时分割表
(7)针对查询较慢的语句,可以使用explain来分析该语句具体的执行情况(有一篇相应博文)


****mysql_fetch_row()和mysql_fetch_array()的区别****
答:这两个函数,返回的都是一个数组,区别就是第一个函数返回的数组是只包含值,我们只能row[0],row[1],这样以数组下标来读取数据,而mysql_fetch_array()返回的数组既包含第一种,也包含键值对的形式,我们可以这样读取数据(假如数据库的字段是username,passwd):
row[‘username‘],row[‘passwd‘]

你可能感兴趣的:(校招总结:数据库(MySQL))