zoukankan      html  css  js  c++  java
  • 【刷题】面筋-数据库-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. 垂直分割

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

    • 这样可以降低表的复杂度和字段的数目,从而达到优化的目的

    10. 优化where查询

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

    比如: select 列 from 表 where age*2=36;   建议改成  select 列 from 表 where age=36/2;

    • ②. 应尽量避免在 where 子句中使用 !=或<> 操作符,否则将引擎放弃使用索引而进行全表扫描。

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

    • ④. 应尽量避免在 where 子句中使用 or 来连接条件

    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)

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

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

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

    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

  • 相关阅读:
    2021.1.28 个人rating赛补题报告
    2021.1.23 个人rating赛补题报告
    2021.1.23 个人rating赛补题报告
    2020.12.14 个人训练赛补题报告
    2020.11.28 2020团体程序设计天梯赛补题报告
    2020.12.3 Codeforces Beta Round #73(Div2)补题报告
    Xhorse VVDI Prog V5.0.6 is Ready for BCM2 Adapter
    Program 2021 Ford Bronco All Keys Lost using VVDI Key Tool Plus
    Xhorse VVDI Prog V5.0.4 Software Update in July 2021
    How to use Xhorse VVDI2 to Exchange BMW FEM/BDC Module?
  • 原文地址:https://www.cnblogs.com/anliux/p/12853970.html
Copyright © 2011-2022 走看看