关系数据库之mysql三:从一条sql的生命周期说起
时间:2022-02-25 11:44
sql的执行过程和mysql体系架构基本一致 建立与 MySQL 的连接,用于查询SQL语句,判断权限 。 对 SQL 语句进行硬解析,分析器先会做词法分析。分析SQL 语句的组成成分。判断输入的 SQL 语句是否满足语法规则。 优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。 不同的执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。 EXPLAIN命令输出MySQL将如何执行你的SQL语句,但不会返回数据 system > const > eq_ref > ref > range > index > ALL(查询效率) 光看 filesort 字面意思,可能以为是要利用磁盘文件进行排序,实则不全然。 当MySQL不能使用索引进行排序时,就会利用自己的排序算法(快速排序算法)在内存(sort buffer)中对数据进行排序,如果内存装载不下,它会将磁盘上的数据进行分块,再对各个 数据块进行排序,然后将各个块合并成有序的结果集(实际上就是外排序)。 当对连接操作进行排序时,如果ORDER BY仅仅引用第一个表的列,MySQL对该表进行filesort操作,然后进行连接处理,此时,EXPLAIN输出“Using filesort”;否则,MySQL必 须将查询的结果集生成一个临时表,在连接完成之后行行filesort操作,此时,EXPLAIN输出“Using temporary;Using filesort”。 为解释方便,来一个demo: SELECT * FROM user WHERE city='上海'; SELECT * FROM user WHERE age='26'; SELECT * FROM user WHERE age='26' AND city=‘上海'; SELECT * FROM user WHERE user_name LIKE '%N'; SELECT * FROM user WHERE user_name='JueJin' AND city LIKE '上%' AND age=31; SELECT * FROM user WHERE user_name=concat(user_name,'PLUS'); SELECT user_name, city, age FROM user WHERE user_name='Tony' AND age='28' AND city='上海'; 因为要查询的字段(user_name, city, age)都包含在组合索引的索引列中,所以就使用了覆盖索引查询,查看是否使用了覆盖索引可以通过执行计划中的Extra中的值为Using index则证明使用了覆盖索引,覆盖索引可以极大的提高访问性能。 在排序操作中如果能使用到索引来排序,那么可以极大地提高排序的速度,要使用索引来排序需要满足以下两点即可: 排序可用demo: 排序不可用demo: 不要返回应用户程序所不需要的数据限制返回数 LIMIT:MySQL并不能按照需求返回数据量,也就是MySQL总是会查询出全部数据,使用LIMIT子句其实是为了减小网络数据传输的压力,并不会减小数据的读取行数。 去掉不需要的列 正确使用索引的优点 对于如下列考虑使用索引 考虑针对字符串型列使用前缀索引 更多相关免费学习推荐:mysql教程(视频) 以上就是关系数据库之mysql三:从一条sql的生命周期说起的详细内容,更多请关注gxlsystem.com其它相关文章!mysql教程栏目介绍关系数据库的sql的生命周期。
MYSQL Query Processing
执行过程:
连接器:
查询缓存:
分析器:
优化器:
执行器:
理解执行计划
如何使用
[root@localhost][(none)]> explain select * from 表名 where project_id = 36;
+----+-------------+--------------------------+------------+------+---------------+------------+---------+-------+--------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------------------------+------------+------+---------------+------------+---------+-------+--------+----------+-------+
| 1 | SIMPLE | 表名 | NULL | ref | project_id | project_id | 4 | const | 797964 | 100.00 | NULL |
+----+-------------+--------------------------+------------+------+---------------+------------+---------+-------+--------+----------+-------+复制代码
id
select_type
table
type
possible_keys
key
key_length
ref
rows
filtered
extra
提高查询效率
正确使用索引
DROP TABLE IF EXISTS user;
CREATE TABLE user(
id int AUTO_INCREMENT PRIMARY KEY,
user_name varchar(30) NOT NULL,
gender bit(1) NOT NULL DEFAULT b’1’,
city varchar(50) NOT NULL,
age int NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE user ADD INDEX idx_user(user_name , city , age);
复制代码
什么样的索引可以被使用?
什么样的索引无法被使用?
选择合适的索引列顺序
覆盖索引条件
使用索引进行排序
数据获取建议
索引的代价
索引最佳实践
SELECT语句效率低下时考虑
调优表连接方法