【刷题】面筋-数据库-mysql的优化

MySQL优化mysql

1. 避免使用 select *

  • 你须要什么信息,就查询什么信息,查询的多了,查询的速度确定就会慢

2. 当你只须要查询出一条数据的时候,要使用 limit 1

  • 好比你要查询数据中是否有男生,只要查询一条含有男生的记录就好了,后面不须要再查了,使用Limit 1 能够在找到一条数据后中止搜索

3. 创建高性能的索引

  • 索引不是随便加的也不是索引越多越好,更不是全部索引对查询都有效

4. 建数据库表时,给字段设置固定合适的大小.

  • 字段不能设置的太大,设置太大就形成浪费,会使查询速度变慢

5. 要尽可能使用not null

6. EXPLAIN 你的 SELECT 查询

  • 使用EXPLAIN,能够帮助你更了解MySQL是如何处理你的sql语句的, 你能够查看到sql的执行计划,这样你就能更好的去了解你的sql语句的不足,而后优化语句.

7. 在Join表的时候,被用来Join的字段,应该是相同的类型的,且字段应该是被建过索引的,这样,MySQL内部会启动为你优化Join的SQL语句的机制。

8. 若是你有一个字段,好比“性别”,“国家”,“民族”, “省份”,“状态”或“部门”,这些字段的取值是有限并且固定的,那么,应该使用 ENUM 而不是 VARCHAR。

  • 由于在MySQL中,ENUM类型被看成数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,咱们又能够提升数据库的性能。

9. 垂直分割

- 将经常使用和有关系的字段放在相同的表中,把一张表的数据分红几张表sql

  • 这样能够下降表的复杂度和字段的数目,从而达到优化的目的

10. 优化where查询

  • ①. 避免在where子句中对字段进行表达式操做

好比: select 列 from 表 where age*2=36;   建议改为  select 列 from 表 where age=36/2;数据库

  • ②. 应尽可能避免在 where 子句中使用 !=或<> 操做符,不然将引擎放弃使用索引而进行全表扫描。性能

  • ③. 应尽可能避免在 where 子句中对字段进行 null 值 判断优化

  • ④. 应尽可能避免在 where 子句中使用 or 来链接条件.net

11. 不建议使用%前缀模糊查询,这种查询会致使索引失效而进行全表扫描

  • 例如LIKE “%name”或者LIKE “%name%这两种都是不建议的.可是可使用LIKE “name%”。
  • 对于LIKE “%name%,可使用全文索引的形式

12.  要慎用in和 not in

  • 例如:select id from t where num in(1,2,3)   建议改为 select id from t where num between 1 and 3
  • 对于连续的数值,能用 between 就不要用 in 了

13. 理解in和exists, not in和not exists的区别

  • 不少时候用 exists 代替 in 是一个好的选择:如查询语句使用了not in那么内外表都进行全表扫描,没用到索引,而not exists子查询依然能用到表上索引,因此不管哪一个表大,用not exists都比not in要快。
    - select num from a where num in(select num from b)blog

  • 建议改为: select num from a where exists(select 1 from b where num=a.num)索引

  • 区分in和exists主要是形成了驱动顺序的改变(这是性能变化的关键),若是是exists,那么之外层表为驱动表,先被访问,若是是IN,那么先执行子查询。因此IN适合于外表大而内表小的状况;EXISTS适合于外表小而内表大的状况。get

  • 关于not in和not exists,推荐使用not exists,不只仅是效率问题,not in可能存在逻辑问题it

14. 理解select Count (*)和Select Count(1)以及Select Count(column)区别

  • 通常状况下,Select Count (*)和Select Count(1)两着返回结果是同样的

  • 假如表沒有主键(Primary key), 那么count(1)比count(*)快,

  • 若是有主键的話,那主键做为count的条件时候count(主键)最快

  • 若是你的表只有一个字段的话那count(*)就是最快的

  • count(*) 跟 count(1) 的结果同样,都包括对NULL的统计,而count(column) 是不包括NULL的统计

参考连接

END

相关文章
相关标签/搜索