1、實踐表明mysql單表數據超過一億后,數據進行交并差效率會非常慢,所以這時候就要進行表的優化。
我這里主要是使用索引。
2、表字段精量精簡
查索引,建索引,刪索引語法
?--查看索引
-- SHOW INDEX FROM 表名;
-- 刪除索引
--ALTER TABLE 表名 DROP INDEX username_index;
--建索引
CREATE INDEX 索引名ON 表名(索引字段(10));
?--查看索引
-- SHOW INDEX FROM 表名;
-- 刪除索引
--ALTER TABLE 表名 DROP INDEX username_index;--建索引
CREATE INDEX 索引名ON 表名(索引字段(10));
3、mysql聚合函數大全
MySQL 提供了豐富的聚合函數,用于對一組值執行計算并返回單個值。以下是 MySQL 中常用的聚合函數及其用法:
基本聚合函數
1. COUNT()
-
計算行數或非NULL值的數量
SELECT COUNT(*) FROM employees; -- 計算總行數 SELECT COUNT(department_id) FROM employees; -- 計算非NULL的department_id數量 SELECT COUNT(DISTINCT department_id) FROM employees; -- 計算不同department_id的數量
2. SUM()
-
計算數值列的總和
SELECT SUM(salary) FROM employees; SELECT SUM(salary * 1.1) FROM employees; -- 可以包含表達式
3. AVG()
-
計算數值列的平均值
SELECT AVG(salary) FROM employees; SELECT AVG(DISTINCT salary) FROM employees; -- 計算不同值的平均值
4. MIN()
-
返回列中的最小值
SELECT MIN(salary) FROM employees; SELECT MIN(hire_date) FROM employees; -- 也適用于日期
5. MAX()
-
返回列中的最大值
SELECT MAX(salary) FROM employees; SELECT MAX(hire_date) FROM employees; -- 也適用于日期
高級聚合函數
6. GROUP_CONCAT()
-
將多行值連接成一個字符串
SELECT department_id, GROUP_CONCAT(last_name) FROM employees GROUP BY department_id;-- 使用分隔符和排序 SELECT department_id, GROUP_CONCAT(last_name ORDER BY hire_date SEPARATOR ', ') FROM employees GROUP BY department_id;
7. STD() / STDDEV()
-
計算總體標準差
SELECT STD(salary) FROM employees;
8. STDDEV_POP()
-
計算總體標準差(同STD)
SELECT STDDEV_POP(salary) FROM employees;
9. STDDEV_SAMP()
-
計算樣本標準差
SELECT STDDEV_SAMP(salary) FROM employees;
10. VAR_POP()
-
計算總體方差
SELECT VAR_POP(salary) FROM employees;
11. VAR_SAMP()
-
計算樣本方差
SELECT VAR_SAMP(salary) FROM employees;
12. VARIANCE()
-
計算總體方差(同VAR_POP)
SELECT VARIANCE(salary) FROM employees;
統計聚合函數
13. BIT_AND()
-
對二進制位執行AND操作
SELECT BIT_AND(flags) FROM permissions;
14. BIT_OR()
-
對二進制位執行OR操作
SELECT BIT_OR(flags) FROM permissions;
15. BIT_XOR()
-
對二進制位執行XOR操作
SELECT BIT_XOR(flags) FROM permissions;
分組函數
16. WITH ROLLUP
-
添加小計和總計行
SELECT department_id, COUNT(*), AVG(salary) FROM employees GROUP BY department_id WITH ROLLUP;
窗口函數(MySQL 8.0+)
雖然嚴格來說不是聚合函數,但窗口函數常與聚合一起使用:
17. ROW_NUMBER()
SELECT employee_id, salary,ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank FROM employees;
18. RANK()
SELECT employee_id, salary,RANK() OVER (ORDER BY salary DESC) AS rank FROM employees;
19. DENSE_RANK()
SELECT employee_id, salary,DENSE_RANK() OVER (ORDER BY salary DESC) AS rank FROM employees;
使用注意事項
-
聚合函數通常與?
GROUP BY
?子句一起使用 -
可以在?
HAVING
?子句中使用聚合函數進行過濾 -
SELECT
?列表中非聚合列必須出現在?GROUP BY
?中 -
聚合函數會忽略?
NULL
?值(除了?COUNT(*)
) -
MySQL 5.7及以上版本對?
GROUP BY
?有更嚴格的SQL模式要求
性能優化建議
-
為?
GROUP BY
?和?ORDER BY
?列創建索引 -
考慮使用?
EXPLAIN
?分析查詢執行計劃 -
對于大數據集,可能需要調整?
group_concat_max_len
?系統變量 -
在可能的情況下,限制聚合數據集的大小