面试题:谈谈如何优化MYSQL数据库查询

一、优化数据类型html

  MySQL中数据类型有多种,若是你是一名DBA,正在按照优化的原则对数据类型进行严格的检查,但开发人员可能会选择他们认为最简单的方案,以加快编码速度,或者选择最明显的选择,所以,你可能面临的都不是最佳的选择,若是可能的话,你应该尝试以通用准则来改变这些决定。mysql

  (1)避免使用NULL算法

  NULL对于大多数数据库都须要特殊处理,MySQL也不例外,它须要更多的代码,更多的检查和特殊的索引逻辑,有些开发人员彻底没有意识到,建立表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1做为默认值。sql

  (2)仅可能使用更小的字段数据库

  MySQL从磁盘读取数据后是存储到内存中的,而后使用cpu周期和磁盘I/O读取它,这意味着越小的数据类型占用的空间越小,从磁盘读或打包到内存的效率都更好,但也不要太过执着减少数据类型,要是之后应用程序发生什么变化就没有空间了。修改表将须要重构,间接地可能引发代码的改变,这是很头疼的问题,所以须要找到一个平衡点。学习

二、当心字符集转换测试

  客户端或应用程序使用的字符集可能和表自己的字符集不同,这须要MySQL在运行过程当中隐含地进行转换,此外,要肯定字符集如UTF-8是否支持多字节字符,所以它们须要更多的存储空间。优化

三、优化count(my_col)和count(*)编码

  若是你使用MyISAM表,在没有where子句的状况下使用count(*)速度是很快的,由于行数量的统计是很是精确的,所以MySQL不会一行一行地去找,进而得出行数,如my_col列没有空值,那么和前面说的状况会同样,即count(my_col)速度也会很快。spa

  若是有where子句时使用count( ),基本上就没法进行更多优化了,在where子句中超出了明显的索引列,对于复杂的where子句,只有使用覆盖索引才有用。

  除了上面的建议外,你还可使用汇总表,它们让你能够对表的内容保持更新,你可使用触发器,或者应用程序逻辑保持汇总表老是最新状态,或者按期运行一个批处理做业保持填充最新的数据信息,若是你采用后者,你的信息将会很是接近,但不是精确的,依赖于批处理做业多久运行一次,这须要权衡应用程序对精确信息的须要,和保持数据更新的系统开销,要在这两者之间找到一个平衡点。

 

四、优化子查询

  遇到子查询时,MySQL查询优化引擎并非老是最有效的,这就是为何常常将子查询转换为链接查询的缘由了,优化器已经可以正确处理链接查询了,固然要注意的一点是,确保链接表(第二个表)的链接列是有索引的,在第一个表上MySQL一般会相对于第二个表的查询子集进行一次全表扫描,这是嵌套循环算法的一部分。

  五、优化UNION

  在跨多个不一样的数据库时使用UNION是一个有趣的优化方法,UNION从两个互不关联的表中返回数据,这就意味着不会出现重复的行,同时也必须对数据进行排序,咱们知道排序是很是耗费资源的,特别是对大表的排序。

  UNION ALL能够大大加快速度,若是你已经知道你的数据不会包括重复行,或者你不在意是否会出现重复的行,在这两种状况下使用UNION ALL更适合。此外,还能够在应用程序逻辑中采用某些方法避免出现重复的行,这样UNION ALL和UNION返回的结果都是同样的,但UNION ALL不会进行排序。

 

原文出自【比特网】:http://soft.chinabyte.com/database/254/11335754.shtml

 

相关阅读

mysql 的优化(如何查询mysql中执行效率低的sql语句)   

mysql 千万级数据库如何进行多张结构相同的表联合查询?如何优化或设置提升查询速度?

mysql数据库千万级别数据的查询优化和分页测试

mysql学习心得

优化Mysql数据库的8个方法

相关文章
相关标签/搜索