mysql优化以及注意事项

# 1、python插入数据到impala或mysql
优化前:使用insert into一条条插入数据
优化后:insert into ** values(所有数据)

# 2、避免 SELECT *
(1)增加查询分析器解析成本。
(2)无用字段增加网络 消耗,尤其是 text 类型的字段
(3)增减字段容易与 resultMap 配置不一致。
举例:拧螺丝我需要什么工具,我把整个工具箱拿来,其实是一个道理。当我需要拧螺丝钉时,我会挑选好需要的工具,如果工具箱拿来,这玩意比较重,而且也可能拿到很大的扳手,但是我又用不上,你说我带它干嘛。

# 3、CHAR 和VARCHAR 的区别?
1、CHAR 和 VARCHAR 类型在存储和检索方面有所不同
2、CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 ~255 当 CHAR 值被存储时,它们被用空格填充到特定长度,检索 CHAR 值时需删除尾随空格。
 
我们可以看到char类型在存放数据的时候,中间是没有间隔的,数据本身是有空格的,但是数据段之间没有间隔,因为我们在创建列的时候已经告诉MySQL列的长度了,MySQL在查询数据的时候,只需要按部就班寻找就行了,不需要在中途计算这个数据段的长度。
但是varchar类型的存放就不同了,在每个数据段开头,都要有一段空间(1~2个字节)存放数据段的长度,在数据段的结尾还有一段空间(1个字节)标记此字段的节数。MySQL在读取一个数据段的时候,首先要读开头,比如读到了3,说明数据段的长度是3,之后就不多不少,只读3个字节。所以MySQL在遍历数据的时候,磁针要比char类型的列多读很多次磁盘来获取字段的真实长度,这就是为什么varchar比char查询效率低的原因了。

CHAR会默认切掉字符串末尾的空格,如果需要保留末尾的空格,记得用varchar类型!

4、NOW()和 CURRENT_DATE()有什么区别?

NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。CURRENT_DATE()仅显示当前年份, 月份和日期。

 

5、having使用注意事项:

在 MySQL 中,HAVING 子句通常用于筛选分组后的数据,而 WHERE 子句用于筛选未分组的数据。同时,ORDER BY 用于对结果集进行排序。在使用 HAVING 子句时,你需要注意以下几点:

WHERE 子句:WHERE 子句用于在数据分组之前对数据进行过滤。你可以在 WHERE 子句中指定条件来筛选行,然后将符合条件的行分组。WHERE 子句作用于原始数据,而 HAVING 子句作用于分组后的数据。

HAVING 子句:HAVING 子句用于筛选已经分组的数据。一般情况下,你会在分组操作之后使用 HAVING 来筛选分组的结果。你可以使用聚合函数(如 SUM、COUNT、AVG 等)和逻辑运算符(AND、OR 等)在 HAVING 子句中指定筛选条件。

ORDER BY 子句:ORDER BY 子句用于对结果集进行排序。通常,你可以在查询的最后使用 ORDER BY 子句,它会根据指定的列对结果进行排序,但它不会影响分组或筛选。

因此,在查询中,通常的顺序是 WHERE -> GROUP BY -> HAVING -> ORDER BY。你可以先使用 WHERE 子句进行初步筛选,然后使用 GROUP BY 子句将数据分组,接着使用 HAVING 子句对分组后的数据进行筛选,最后使用 ORDER BY 子句对结果进行排序。

要注意的是,在一些情况下,你也可以在 HAVING 子句中使用聚合函数来筛选分组后的数据,而无需使用 WHERE 子句。不过,根据需求和查询的复杂性,可以合理使用这些子句来获取所需的结果。

#逻辑运算:你可以在 HAVING 子句中使用逻辑运算符(AND、OR、NOT)来组合条件,
#以实现更复杂的筛选逻辑。

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) IS NOT NULL

SELECT department, MAX(salary) AS max_salary
FROM employees
GROUP BY department
HAVING MAX(salary) > (SELECT AVG(salary) FROM employees);

6、

group by 的注意事项以及方法

GROUP BY 子句用于将查询结果根据一个或多个列进行分组,并对每个组应用聚合函数,如 SUMCOUNTAVG 等。以下是使用 GROUP BY 子句时的注意事项和方法:

注意事项

  1. 聚合函数:通常与 GROUP BY 一起使用的是聚合函数,如 SUMCOUNTAVG。在 SELECT 子句中列出的字段应该是聚合函数或 GROUP BY 子句中列出的列。
  2. GROUP BY :列出的每个列都是分组依据,确保它们是表中的有效列,并且符合数据类型。通常,这些列包含非重复的值,以便构成不同的组。
  3. HAVING 子句HAVING 子句通常与 GROUP BY 一起使用,用于筛选分组后的结果。它类似于 WHERE 子句,但作用于分组后的数据。
  4. 性能考虑GROUP BY 子句可以导致查询性能下降,特别是当操作大型数据集时。确保表上有适当的索引以提高查询速度。
  5. 正确的聚合:选择适当的聚合函数以符合你的需求。例如,如果需要计算总和,使用 SUM;如果需要计算平均值,使用 AVG
  6. 多列分组:可以同时根据多个列进行分组,这样可以更细粒度地控制数据的组织。

使用方法

  1. 单列分组:如果只需要按一个列分组,可以简单地在 GROUP BY 子句中列出该列。例如,GROUP BY department 会将结果按部门进行分组。
  2. 多列分组:要按多个列分组,只需在 GROUP BY 子句中列出这些列,用逗号分隔。例如,GROUP BY department, location 会根据部门和位置进行分组。
  3. 聚合函数:在 SELECT 子句中,使用聚合函数对每个分组应用需要的计算。例如,SELECT department, AVG(salary) FROM employees GROUP BY department 会计算每个部门的平均工资。
  4. HAVING 子句:如果需要筛选分组后的结果,可以在 HAVING 子句中指定条件。例如,HAVING AVG(salary) > 50000 会筛选出平均工资高于 50000 的部门。
  5. 嵌套子查询GROUP BY 子句也可以与嵌套子查询一起使用,以构建更复杂的分组逻辑。
  6. 数据分析GROUP BY 可用于执行数据分析,如生成报表、计算统计信息等。

总之,GROUP BY 子句是 SQL 中用于分组数据并执行聚合操作的重要工具。了解如何正确列出分组列、使用聚合函数和 HAVING 子句,以及处理多列分组,有助于你更好地使用 SQL 进行数据分析和报表生成。

7、

ORDER BY 子句的注意事项和使用方法

ORDER BY 子句用于对查询结果集按一个或多个列进行排序,可以以升序(默认)或降序的方式排序。以下是关于 ORDER BY 子句的注意事项和使用方法:

注意事项

  1. 正确的列名:确保在 ORDER BY 子句中使用的列名是查询结果集中存在的列名,否则会引发错误。
  2. 多列排序:可以按多个列进行排序,只需在 ORDER BY 子句中列出这些列,用逗号分隔。首先按第一个列排序,如果存在相同值,则按第二个列排序,以此类推。
  3. 性能考虑:排序大型数据集可能会对查询性能产生影响,特别是如果没有合适的索引。确保数据库表上有适当的索引以提高排序效率。
  4. 升序和降序:默认情况下,ORDER BY 会按升序(从小到大)排序。如果需要降序排序,可以在列名后面添加 DESC 关键字。例如,ORDER BY column_name DESC 会按降序排序。

使用方法

  1. 单列排序:要按单个列排序,只需在 ORDER BY 子句中列出该列。例如,ORDER BY salary 会按工资升序排序。
  2. 单列降序排序:要按降序排序,可以在列名后面添加 DESC。例如,ORDER BY salary DESC 会按工资降序排序。
  3. 多列排序:按多个列排序时,列出这些列并指定排序方式。例如,ORDER BY department, salary DESC 会先按部门升序排序,然后在同一部门内按工资降序排序
  4. 数字和文本排序:根据数据类型不同,排序行为可能会有所不同。数字通常会按数值大小排序,而文本通常按字母顺序排序。
  5. NULL 值处理:在排序时,数据库通常将 NULL 值排在最前或最后,具体取决于数据库系统的默认设置。你也可以使用 NULLS FIRST NULLS LAST 来显式指定 NULL 值的位置。
  6. LIMIT 子句:结合 LIMIT 子句可以限制返回的排序结果的行数。例如,ORDER BY salary DESC LIMIT 10 会返回按工资降序排序的前 10 行。
  7. 多列排序案例:可以按不同列的组合排序,以满足特定需求。例如,ORDER BY department, hire_date 可以按部门升序排序,然后在同一部门内按入职日期升序排序。

ORDER BY 子句是 SQL 中用于控制查询结果排序的关键部分。根据需要选择合适的列和排序方式,有助于获得所需的排序效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值