MySQL优化查询

mysq查询l优化

  指标:执行时间 检查的行数 返回的行数

1. count的优化

  比如:计算id大于5的城市 a. select count(*) from world.city where id > 5; b. select (select count(*) from world.city) – count(*) from world.city where id <= 5; a语句当行数超过11行的时候需要扫描的行数比b语句要多, b语句扫描了6行,此种情况下,b语句比a语句更有效率。当没有where语句的时候直接select count(*) from world.city这样会更快,因为mysql总是知道表的行数。

案例:

# 建库
CREATE DATABASE IF NOT EXISTS db3 DEFAULT CHARSET=utf8;
USE db3;
# 建表
CREATE TABLE IF NOT EXISTS cnt(id INT , NAME VARCHAR(10),age INT ,tel VARCHAR(10));
# 创建存储过程 procedrue  
DELIMITER $
CREATE PROCEDURE cnt()
BEGIN
#定义变量 declare
DECLARE i INT DEFAULT 0;
WHILE(i<100000) DO
    BEGIN
        SELECT i;
        SET i=i+1;
        INSERT INTO cnt(id,NAME)VALUES(i,'zs');
    END;
END WHILE;
END $
DELIMITER ;
#调用存储过程
CALL cnt();

    
SELECT COUNT(*)FROM cnt;
#执行耗时   : 0 sec 传送时间   : 0.051 sec 总耗时      : 0.051 sec
#数据库知道表内有多少条数据    

SELECT COUNT(*) FROM cnt WHERE id > 5;  
# 执行耗时   : 0.130 sec 传送时间   : 0 sec 总耗时      : 0.130 sec
# 使用where 扫描了全表 id > 5的所有数据 总查询99995条

SELECT (SELECT COUNT(*) FROM cnt) - COUNT(*) FROM cnt WHERE id <=5 ;
# 执行耗时   : 0.080 sec 传送时间   : 0 sec  总耗时      : 0.081 sec
# 使用where 扫描全表 id <= 5 的五条数据  加上 (SELECT COUNT(*) FROM cnt) 一条数据 总查询 6 条

2、索引

强制使用索引

# 10.必要时强制查询优化器使用索引
#建表
create table if not exists T1(processid int, nextprocess int);
#建索引
create index index_processID on T1(processid);
# 10.1:不使用索引
select * from T1 where nextprocess = 1 and processid in (8,32,45);
# 10.2: 强制使用索引
select * from T1 froce index(index_processID)
 where nextprocess = 1 and process = 1 and processid in (8,32,45);

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值