主键索引不需要创建,系统会自动生成。
create index index_name on table(column(length));
alter table table_name add index index_name(column(length));
create unique index index_name on table (column(lnegth));
alter table table_name add unique index index_name(column);
create fulltext index index_name on table(column(length));
alter table table_name add fulltext index_name(column);
alter table table_name add index index_name_(title(50),time(10),......);
drop index index_name on table;
show index from table_name
MyISAM采用的是非聚簇索引,InnoDB采用的是聚簇索引
由于B树的其他子节点也存储有数据data,所以在每页中占用了相当一部分内存,而B+树只有主键索引,没有数据data域,每页((4kB,8KB,16KB)存储的主键索引相对来说是比较多的。
InnoDB要求表必须有主键(MyISAM可以没有),如果没有,MySQL系统会自动选择一个唯一标识数据记录的列作为主键
MyISAM的索引文件(mdi)仅仅保存数据记录的地址
MyISAM的数据文件(ibd)中记录对应的记录
聚集索引通过主键搜索十分高效,但是辅助索引搜索需要检索两边索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
了解了索引的基本概念,下面通过实例说明:
-- 删除t1表
DROP TABLE t1;
-- 创建t1表
CREATE TABLE t1(
a INT PRIMARY KEY,
b INT,
c INT,
d INT,
e VARCHAR(20)
)ENGINE = INNODB;
通过创建表,我们要明白,MySQL数据库在创建表的时候会自动添加以(主键)索引,如果没有主键,系统自带rows生成索引。
注意在Oracle数据库中有rownum关键字,查询系统自动生成的序列号
select rownum from table_name;
-- 向t1表中添加数据
insert into t1 values(4,3,1,1,'d');
INSERT INTO t1 VALUES(1,1,1,1,'a');
INSERT INTO t1 VALUES(8,8,8,8,'h');
INSERT INTO t1 VALUES(2,2,2,2,'b');
INSERT INTO t1 VALUES(5,2,3,5,'e');
INSERT INTO t1 VALUES(3,3,2,2,'c');
INSERT INTO t1 VALUES(7,4,5,5,'g');
INSERT INTO t1 VALUES(6,6,4,4,'f');
一页存储不下时,存储在下一页中
可以通过插入数据时不断select查询观察细节
-- 删除表中所有数据
delete from t1;
-- 删除指定id的数据
delete from t1 where a in(1,4,8);
存储过程慢慢生成B+树(数据都在叶子节点)
通过explain查看一些sql语句的性能进行简单的查询
-- 通过primary索引查询
EXPLAIN SELECT * FROM t1 WHERE a > 1;
-- 全表查询all
EXPLAIN SELECT * FROM t1 WHERE b = 1 AND c = 1 AND d = 1 ;
-- 直接主键索引查询,性能高
EXPLAIN SELECT * FROM t1 WHERE a = 8;
-- 通过查看索引,我们发现只有主键查询
SHOW INDEX FROM t1;
所以我们创建其他索引,达到快速查询的要求。
-- 创建bcd组合索引
CREATE INDEX idex_t1_bcd ON t1(b,c,d);
创建组合索引后,执行如下语句:了解key_len
-- 通过组合索引index_t1_bcd查询,但是由于是*所以需要回表查询using where
-- key_len是真正使用的索引大小,此处为15
EXPLAIN SELECT * FROM t1 WHERE b = 1 AND c = 1 AND d = 1 ;
-- key_len此处为5
EXPLAIN SELECT * FROM t1 WHERE b = 1;
-- key_len此处为10,e不在index_t1_bcd组合索引的列中,不计算
EXPLAIN SELECT * FROM t1 WHERE b = 1 AND c = 1 AND e = 1 ;
练习完以上案例后,看如下图,就会明白索引中原来有这么多原理和关键字
要运用组合索引时,必须从遵循最左原则(就是最左边的列必须出现在where后的第一个)
-- 全表查询all
EXPLAIN SELECT * FROM t1 WHERE c = 1 AND d = 1 ;
-- 虽然使用的是index_t1_bcd索引但是由于c > 1是范围,所以key_len在此处是10
EXPLAIN SELECT * FROM t1 WHERE b = 1 AND c > 1 AND d = 1 ;
了解了以上语句执行后效果,还有除此之外运用组合索引的特殊情况:
-- possible_keys显示此处可能使用index_t1_bcd索引
-- 但是由于b > 1是范围,type是all,系统自动选择全表查询
EXPLAIN SELECT * FROM t1 WHERE b > 1;
-- 通过组合索引index_t1_bcd查询,key_len此处为5
-- 有人就说了b > 6不是范围吗?怎么能用组合?难道不遵循最左原则?
-- 这是因为b > 6后面只有一个记录,所以系统会选择最优的查询路径
EXPLAIN SELECT * FROM t1 WHERE b > 6;
索引覆盖的使用能够减少树的搜索次数,避免了回表
-- 通过组合索引index_t1_bcd查询,key_len此处为5
-- 有人又有疑问了,b > 1不是范围吗?怎么能有组合索引?
-- 这是因为查询的只有b所以通过组合查询比较快。
EXPLAIN SELECT b FROM t1 WHERE b > 1;
-- 在组合索引中就有id的存储,所以不用回表查询,这就是索引覆盖
EXPLAIN SELECT a,b FROM t1 WHERE b > 1;
MySQL5.6出现,主要用于非主键索引尤其联合索引(组合索引),减少回表查询的次数
-- 在没有索引下推之前,在组合索引中有几条b = 1的记录(忽略d),就会回表查询(d)多少次
-- 对于此sql语句b = 3有两条((4,3,1,1,'d'),(3,3,2,2,'c'))查询过程就需要回表两次
-- 而又索引下推优化后,在组合索引中不会忽略d这个字段,进而判断符合条件的,从而只需要回表查询一次。
-- 索引下推在Extra中会显示Using index condition
-- 虽说需要回表查询,但是经过索引下推后,满足b = 3 and d = 1的记录只有1条
-- 所以row在此案例中应该显示1
EXPLAIN SELECT * FROM t1 WHERE b = 3 AND d = 1 ;
-- 没有d字段,所以需要将满足b = 3的记录全部回表查询,row显示2
EXPLAIN SELECT * FROM t1 WHERE b = 3 AND e = 1 ;
以上都是int类型的索引,下面给varchar类型创建索引
CREATE INDEX idx_t1_e ON t1(e);
执行如下sql语句:数据类型转换
-- 返回结果为1
SELECT 1 = 1;
-- 返回结果为0
SELECT 1 = 0;
-- 返回结果为1
SELECT 1 = '1';
EXPLAIN SELECT * FROM t1 WHERE a = 1;
EXPLAIN SELECT * FROM t1 WHERE a = '1';
EXPLAIN SELECT * FROM t1 WHERE e = 1;
EXPLAIN SELECT * FROM t1 WHERE e = '1';
-- 查看存储引擎
SHOW ENGINES;
MySQL通过日志记录数据库操作信息和错误信息。
-- 查看当前数据库中的日志使用信息
SHOW VARIABLES LIKE 'log_%';
默认开启。记录了运行中遇到的所有严重的错误以及MySQL每次启动和关闭的详细信息
错误日志名字;hostname.err
查看日志的文件路径:log_error
log_warings:警告信息是否开启
show variables like '%datadir%';
ibd为InnoDB存储,.MYD,.MYI为MyISAM存储
InnoDB数据文件
MyISAM数据文件;
-- 查看总内存大小
SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool_pages_%';
据信息,主要包括表结构的定义信息
-- 查看总内存大小
SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool_pages_%';
关键字:
以上都是在学习过程中在学习资料中整理的,如有侵权,联系删除。