索引的原理是:索引就是数据结构,给一个字段添加了B+Tree数据结构后,字段就会根据这种数据结构快速的去查到目标数据。 有个问题是: 数据结构是根据数字来排列的,那么像字符类型的字段是怎么根据这种数据结构排列的? MySQL中存储过程是什么? MySQL循环批量插入数据01(jdbc原生代码的实现) MySQL循环批量插入数据02 主键是否自动创建索引? 怎么删除主键索引? 怎么给字符串字段建索引?因为索引是在数字的基础上进行的,字符串中的字母、汉字、特别符号,该怎么转换成数字?是通过UTF-8来计算得出数建的吗? 在hashmap中的key是通过哈希函数运算得出的对应的key。
6.3.1中的数据库读写分离可以使用mycat和AOP实现。那么AOP是具体怎么实现的?
覆盖索引和复合索引的区别:覆盖索引是指select 后的字段是在索引列。复合索引是指索引的一个类型。
一、MySQL的存储引擎
1.1、在MySQL版本5.5之前默认的存储引擎是MYISAM,版本5.5之后默认的存储引擎是InnoDB。
1.1.1、存储引擎InnoDB和MYISAM的区别。
InnoDB支持事务和行锁,外键。MYISAM不支持事务和外键,只支持表锁。
1.1.2、行锁和表锁
当多个线程对同一张表操作时,行锁是允许多个线程同时操作一张表。而表锁,只允许一个线程对一张表进行操作。
二、MySQL的索引
如果发现某一条SQL查询执行慢,应该提前告诉数据库管理员,让创建索引。因为如果数据量大的话,一般创建索引会花费很长的时间。
2.1、MySQL的索引是什么?
2.1.1、MySQL的索引其实是数据结构,具体是采用的数据结构是B+Tree。
为什么没有采用二叉树和红黑树呢? 因为二叉树容易形成歪脖子树,而用红黑树的话,数据量大时,层次结构会比较深。
2.2、MySQL的索引能干什么?
2.2.1、MySQL的索引主要目的是可以提高查询效率
2.3、MySQL的索引分类
2.3.1、单值索引 :即一个索引只包含单个列,一个表可以有多个单列索引
2.3.2、唯一索引 :索引列的值必须唯一,但允许有空值(唯一索引的作用,其实不是提高查询效率,主要是为了防止数据的重复 )
2.3.3、 复合索引 :即一个索引包含多个列
2.4、存储引擎和索引的区别
每种存储引擎支持的索引类型不同!
2.5、索引设计原则
2.5.1、尽量选择唯一索引
2.5.2、经常在where后面出现的字段
2.6、索引的操作
SHOW INDEX FROM usertest;
CREATE INDEX idx_usertest_name ON usertest( NAME) ;
CREATE UNIQUE INDEX indexName ON tableName( tableColumns( length) )
CREATE INDEX idx_usertest_name_age_address ON usertest( NAME, age, address) ;
DROP INDEX idx_usertest_name_age_address ON usertest;
创建前缀索引的原因是:该字段的长度比较长。创建前缀索引的值是通过计算最快的查询效率得出(索引的选择性)
三、优化SQL步骤之explain
3.1、查看SQL执行频率
show status like 'Com_______' ;
show status like 'Innodb_rows_%' ;
3.2、explain 分析执行计划
EXPLAIN SELECT * FROM usertest u , USER ur WHERE u. ` age` = ur. ` id` ;
字段
含义
id
select查询的序列号,是一组数字,表示的是查询中执行select子句或者是操作表的顺序。
select_type
表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个 SELECT)等
table
输出结果集的表。
type
表示表的连接类型,性能由好到差的连接类型为( system —> const -----> eq_ref ------> ref -------> ref_or_null----> index_merge —> index_subquery -----> range -----> index ------> all )
possible_keys
表示查询时,可能使用的索引
key
表示实际使用的索引
key_len
索引字段的长度
rows
扫描行的数量
extra
执行情况的说明和描述
3.2.1、explain之id,id值表示执行表 的顺序
3.2.1.1、当id相同时,执行表的顺序是从上而下。
3.2.1.2、当id不同时,id越高,执行的优先级越高。
3.2.1.3、当id有相同,有不同时,先执行优先级高的。如果相同时,从上而下执行。
3.2.2、explain之select_type
select_type
含义
SIMPLE
简单的select查询,查询中不包含子查询或者UNION
PRIMARY
查询中若包含任何复杂的子查询,最外层查询标记为该标识
SUBQUERY
在SELECT 或 WHERE 列表中包含了子查询
DERIVED
在FROM 列表中包含的子查询,被标记为 DERIVED(衍生) MYSQL会递归执行这些子查询,把结果放在临时表中
UNION
若第二个SELECT出现在UNION之后,则标记为UNION ; 若UNION包含在FROM子句的子查询中,外层SELECT将被标记为 : DERIVED
UNION RESULT
从UNION表获取结果的SELECT
3.2.3、explain之table,关于显示这一行数据的属于哪张表。
3.2.4、explain之type,这是一项重要的指标 ,一般大于range就可以了。
type
含义
NULL
MySQL不访问任何表,索引,直接返回结果
system
表只有一行记录(等于系统表),这是const类型的特例,一般不会出现
const
表示通过索引一次就找到了,const 用于比较primary key 或者 unique 索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL 就能将该查询转换为一个常量。const于将 “主键” 或 “唯一” 索引的所有部分与常量值进行比较
eq_ref
类似ref,区别在于使用的是唯一索引,使用主键的关联查询,关联查询出的记录只有一条。常见于主键或唯一索引扫描
ref
非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,返回所有匹配某个单独值的所有行(多个)
range
只检索给定返回的行,使用一个索引来选择行。 where 之后出现 between &#x