Shu-How Zの小窝

Loading...

Mysql的学习

Mysql建立

索引优化:

sql优化:
为了解决下面的索引失效问题

序列索引优化:

解决order by的关键在于提前在索引中就给好排序
解决limit优化:
利用id的子查询解决了回表查询然后提升了效能。


关于count()的优化:

`关于COUNT()的效率问题:
COUNT()是用来统计记录数量的函数。不同写法的效率可能不一样,通常情况下,COUNT(*)效率最高,因为它是直接统计表中的记录数,而不需要检查字段是否为空。
不同写法的COUNT()语句和作用:

  1. COUNT(*)

SELECT COUNT(*) FROM tb_sku;
作用:统计tb_sku表中的总记录数,包括所有行,不管字段值是否为空。
2. COUNT(主键 id)

SELECT COUNT(id) FROM tb_sku;
作用:统计tb_sku表中id字段非空的记录数。因为id通常是主键,主键字段不允许为空,所以这个结果和COUNT(*)是一样的。
3. COUNT(1)

SELECT COUNT(1) FROM tb_sku;
作用:统计tb_sku表中的总记录数。COUNT(1)的意思是每行都算作1,然后加起来,结果和COUNT(*)一样。
4. COUNT(字段)

SELECT COUNT(字段) FROM tb_sku;
作用:统计tb_sku表中字段非空的记录数。如果字段有空值,这些空值不会被计入总数。
效率排序:
按照效率排序,通常是这样的:
COUNT() ≈ COUNT(1) > COUNT(主键 id) > COUNT(字段)
COUNT(
)和COUNT(1)效率最高,因为它们直接统计行数,不需要检查字段是否为空。
COUNT(主键 id)效率也高,因为主键字段不会为空。
COUNT(字段)效率可能稍低,因为它需要检查字段是否为空。
总结:
如果只是想统计表的总行数,最好用COUNT(*)或COUNT(1),因为它们效率最高。`
关于update语句的优化
mysql的锁升级! where条件必须要有索引!
视图本身就只是一个摘取,本身并不能存取数据!
所以会出现下面的报错!!

mysql的问题:
进阶篇中的case之类:
concat的作用就是把多个字符串(包括文字和变量)拼接在一起,形成一个完整的句子。在这段代码中,它把“您输入的月份为: ”、month、, 所属的季度为: 和result拼接成了一句话,方便展示结果。

关于loop的循环模式:
-- A. 定义局部变量, 记录累加之后的值;
-- B. 每循环一次, 就会对n进行-1 , 如果n减到0, 则退出循环 ----> leave xx
create procedure p9(in n int)
begin
declare total int default 0;
sum:loop
if n<=0 then
leave sum;
end if;
set total := total + n;
set n := n - 1;
end loop sum;
select total;
end;
call p9(100);

三个特征值对应的sql语句:
根据搜索结果,以下是针对MySQL中DETERMINISTIC、NO SQL和READS SQL DATA三个特征值的具体例子和说明:
DETERMINISTIC(确定性)
表示函数对于相同的输入总是产生相同的结果。这对于优化查询和缓存结果非常重要。例如,下面是一个简单的存储函数,用于计算两个整数的和,并声明为DETERMINISTIC:
sql复制
CREATE FUNCTION add_numbers (a INT, b INT)
RETURNS INT
DETERMINISTIC
BEGIN
RETURN a + b;
END;
在这个例子中,DETERMINISTIC特性声明表示example_function对于相同的输入总是返回相同的结果。
NO SQL
表示函数不包含任何SQL语句,不会读取或修改数据库中的数据。这有助于优化器了解函数的行为,并可能进行进一步的优化。例如,下面是一个计算平方的函数,不包含任何SQL语句,因此可以声明为NO SQL:
sql复制
CREATE FUNCTION calculate_square (a INT)
RETURNS INT
NO SQL
BEGIN
RETURN a * a;
END;
如果函数内部包含任何SQL语句,即使这些语句不实际执行,也不应声明为NO SQL。
READS SQL DATA(读取SQL数据)
表示函数会读取数据库中的数据,但不会修改数据。这有助于确保在事务中正确地使用该函数,因为读取数据的操作通常不会被回滚。例如,下面是一个获取用户邮箱的函数,它从数据库中读取数据,但不会修改数据,因此可以声明为READS SQL DATA:
sql复制
CREATE FUNCTION get_user_email (user_id INT)
RETURNS VARCHAR(255)
READS SQL DATA
BEGIN
DECLARE user_email VARCHAR(255);
SELECT email INTO user_email FROM users WHERE id = user_id;
RETURN user_email;
END;
如果函数需要修改数据库中的数据,应使用MODIFIES SQL DATA特性声明,而不是READS SQL DATA。

posted @   ruo_feng  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示