首页 > 数据库 > MySQL > 正文

快速学习MySQL索引的入门超级教程

2024-07-24 12:45:21
字体:
来源:转载
供稿:网友

所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找。而用的最多,并且是mysql默认的就是二叉树算法 BTREE,通过BTREE算法建立索引的字段,比如扫描20行就能得到未使用BTREE前扫描了2^20行的结果,具体的实现方式后续本博客会出一个算法专题里面会有具体的分析讨论;

Explain优化查询检测

EXPLAIN可以帮助开发人员分析SQL问题,explain显示了mysql如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句.

使用方法,在select语句前加上Explain就可以了:

Explain select * from blog where false;

mysql在执行一条查询之前,会对发出的每条SQL进行分析,决定是否使用索引或全表扫描如果发送一条select * from blog where falseMysql是不会执行查询操作的,因为经过SQL分析器的分析后MySQL已经清楚不会有任何语句符合操作;

Example

mysql> EXPLAIN SELECT `birday` FROM `user` WHERE `birthday` < "1990/2/2";

-- 结果: 

id: 1

 
select_type: SIMPLE -- 查询类型(简单查询,联合查询,子查询) 
 

table: user -- 显示这一行的数据是关于哪张表的   type: range -- 区间索引(在小于1990/2/2区间的数据),这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL,const代表一次就命中,ALL代表扫描了全表才确定结果。一般来说,得保证查询至少达到range级别,最好能达到ref。   possible_keys: birthday  -- 指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。    key: birthday -- 实际使用到的索引。如果为NULL,则没有使用索引。如果为primary的话,表示使用了主键。   key_len: 4 -- 最长的索引宽度。如果键是NULL,长度就是NULL。在不损失精确性的情况下,长度越短越好   ref: const -- 显示哪个字段或常数与key一起被使用。    rows: 1 -- 这个数表示mysql要遍历多少数据才能找到,在innodb上是不准确的。   Extra: Using where; Using index -- 执行状态说明,这里可以看到的坏的例子是Using temporary和Using

select_type

simple 简单select(不使用union或子查询) primary 最外面的select union union中的第二个或后面的select语句 dependent union union中的第二个或后面的select语句,取决于外面的查询 union result union的结果。 subquery 子查询中的第一个select dependent subquery 子查询中的第一个select,取决于外面的查询 derived 导出表的select(from子句的子查询)
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表