mysql 随记

本文深入探讨MySQL数据库的优化策略,包括使用TRUNCATE命令快速清空表、SQL排序优化、索引使用技巧及IN与EXISTS的性能比较。通过遵循最佳左前缀法则和索引创建顺序,提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.MySQL 用 truncate 命令快速清空一个数据库中的所有表
a.先执行select语句生成所有truncate语句
    select CONCAT('truncate TABLE ',table_schema,'.',TABLE_NAME, ';') from INFORMATION_SCHEMA.TABLES where  table_schema in ('dbname');
b.复制truncate语句到mysql命令行执行
sql优化 总结:
①MySQL支持两种方式的排序filesort和index,Using index是指MySQL扫描索引本身完成排序。index效率高,filesort效率低。
②order by满足两种情况会使用Using index。
#1.order by语句使用索引最左前列。
#2.使用where子句与order by子句条件列组合满足索引最左前列。
③尽量在索引列上完成排序,遵循索引建立(索引创建的顺序)时的最佳左前缀法则。
④如果order by的条件不在索引列上,就会产生Using filesort。
⑤group by与order by很类似,其实质是先排序后分组,遵照索引创建顺序的最佳左前缀法则。注意where高于having,能写在where中的限定条件就不要去having限定了。
通俗理解口诀:
   全值匹配我最爱,最左前缀要遵守;
   带头大哥不能死,中间兄弟不能断;
   索引列上少计算,范围之后全失效;
  LIKE百分写最右,覆盖索引不写星;
   不等空值还有or,索引失效要少用。


补充:in和exsits优化
原则:小表驱动大表,即小的数据集驱动大的数据集
in:当B表的数据集必须小于A表的数据集时,in优于exists 
select * from A where id in (select id from B)
#等价于:
  for select id from B
  for select * from A where A.id = B.id
exists:当A表的数据集小于B表的数据集时,exists优于in
  将主查询A的数据,放到子查询B中做条件验证,根据验证结果(true或false)来决定主查询的数据是否保留
select * from A where exists (select 1 from B where B.id = A.id)
#等价于
    for select * from A
    for select * from B where B.id = A.id
#A表与B表的ID字段应建立索引
1、EXISTS (subquery)只返回TRUE或FALSE,因此子查询中的SELECT * 也可以是SELECT 1或select X,官方说法是实际执行时会忽略SELECT清单,因此没有区别
2、EXISTS子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比
3、EXISTS子查询往往也可以用JOIN来代替,何种最优需要具体问题具体分析

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值