mysq查询l优化
指标:执行时间 检查的行数 返回的行数
explain关键字
-- 实际SQL,查找用户名为Jefabc的员工
select * from emp where name = 'Jefabc';
-- 查看SQL是否使用索引,前面加上explain即可
explain select * from emp where name = 'Jefabc';
expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra
概要描述:
id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明
实例:
CREATE TABLE IF NOT EXISTS t(id INT , num INT DEFAULT 0,
NAME VARCHAR(20) );
CREATE INDEX ix_num ON t(num);
CREATE INDEX ix_id ON t(id);
CREATE INDEX ix_to ON t(num,id)
INSERT INTO t()VALUES(1,1,'zs'),(2,2,'ls'),(3,3,'ww');
#0、任何地方都不要使用 select * from t ,用具体的字段列表代替"*",不要返回用不到的任何字段
#1、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
EXPLAIN SELECT id FROM t WHERE NAME IS NULL;
#以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
EXPLAIN SELECT NAME FROM t WHERE num=0;
#2、应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描
EXPLAIN SELECT NAME FROM t WHERE num != 0;
#3、应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
EXPLAIN SELECT id FROM t WHERE num=0 OR NAME=0;
除非查询的字段与where子句中的字段都加了索引 例如:
EXPLAIN SELECT id,num FROM t WHERE num=0 OR id=0;
或者是使用UNion
EXPLAIN
SELECT id FROM t WHERE num=10
UNION ALL
SELECT id FROM t WHERE num=20
#4、in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了:
#没有使用索引
EXPLAIN SELECT * FROM t WHERE num NOT IN (0);
EXPLAIN SELECT * FROM t WHERE num IN (0,2);
#使用了索引 后台默认为 where num=0
EXPLAIN SELECT id FROM t WHERE num IN (0);
EXPLAIN SELECT id FROM t WHERE num BETWEEN 1 AND 3;
#5、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
EXPLAIN SELECT id FROM t WHERE num/2=100
#应改为:
EXPLAIN SELECT id FROM t WHERE num=100*2
#6、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
EXPLAIN SELECT id FROM t WHERE SUBSTRING(id,1,3)='123'
#id以1开头的id,应改为:
EXPLAIN SELECT id FROM t WHERE id LIKE '123%'
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
Original: https://www.cnblogs.com/zzc1102/p/16186599.html
Author: and脱发周大侠
Title: Mysql查询优化
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505456/
转载文章受原作者版权保护。转载请注明原作者出处!