
方法
(1) 根据需求找到关联表
(2)找到关联条件
重点的表tables
* 需求1:统计world库下有几个表
需求2:统计所有库下表的个数
需求3:统计每个库的总数据大小
--单表占空间:AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH
什么使索引:索引其实就是一种算法
BTree
HASH
Rtree
Fulltext
辅助索引
聚集索引
聚集索引提取整行数据作为叶子节点
1、辅助索引和聚集索引最大的区别就在于叶子节点,枝节点和根节点原理相同
2、辅助索引会记录主键值,一般情况(除等值查询),最终都会通过聚集索引(主键)来找到需要的数据
第二种
一般经常用来查询的列作为索引
索引可以有多个,但是索引名不可重名
第一种:单列索引
第二种:前缀索引
前缀索引只能应用到字符串列,数字列不能用前缀索引
联合索引说明:如果在一个表内对A、B、C三个列创建联合索引那么创建索引将按照如下情况创建索引表:
A
AB
ABC
======================================================
(1)查询列无索引
(2)语句不符合走走索引条件
(3)需要查看全表
即把有索引的列全便利一遍
>、 <、 >=、 <=、 like、 between and 在范围扫描中,这些会受到B+tree索引叶子节点上额外的优化,因为这些是连续取值的
or、in 这两个不是连续的取值,所以不能受到B+tree索引的额外优化,使用时相当于Btree索引
!=、 not in 只有在主键列才走索引也是range级别
(1)>、 <、 >=、 <=、 like、 between and
(2)or、in
(3)!=、 not in
多表连接查询,非驱动表连接条件是主键或唯一键
一般多表查询的时,最左侧的表为驱动表,右侧的为非驱动表,下边的例子中country标为非驱动表
7.1.1 数字类型
7.1.2 字符串类型:
字符集
中文
gbk 2字节
utf8 3字节
utf8mb4 4字节
utf8mb4 为例:
举例(1)联合索引等值查询
举例(2) 联合索引中有不等值查询
如果Extra列出现Using temporary、Using filesort,两项内容,那么考虑以下语句的问题。
group by
order by
distinct
join on
union
select (*) from tb_name where create_time >xxx
最终得知是因为这个表数据行数已经超过 一千万了,然后create_time字段又没有索引 。
那解决办法肯定是加索引喽。
但是这个表是一直在线上运行,很重要和业务部分。如果给千万级的大表在线加索引 ,肯定会卡死。
然后就搜罗了一大筐解决方案,比如 在线无锁加索引使用
ALTER TABLE tbl_name ADD PRIMARY (column), ALGORITHM=INPLACE, LOCK=NONE
后来才发现,这个特性是 Mysql 5.6 以后才支持,然而我们的mysql用的是5.5版本
最后在 《高性能Mysql》一书中看到,可在通过 “影子拷贝”来解决,
就是 先创建一张和源表无关的新表,然后通过重命名和删表 *** 作交换两张表;
当给新表加完索引后,最上面那条查询直接就是0.0002s
场景:在给一张有几万条记录的表添加索引时,进度非常慢,导致其它查询无法进行
处理方式:
使用Navicat的命令行模式,执行以下命令:
show processlist
这时会看到有哪些线程正在执行,也可以查看锁表的线程。你会发现alter table * add key ****那个线程状态是Waiting for table metadata lock,后面有个这个表的所有 *** 作都是这个状态,很明显是这条加索引的语句把表给锁了。
查看线程ID,执行
kill 线程ID
这样被锁住的表就能立即被使用了。
由此得出一个结论,当一张表数据量很大时,不要轻易添加索引,会导致表被锁死!如果非要添加,那么应该先把数据表进行备份,然后进行空表添加索引。
只能通过ALTER TABLE不能create index
参数说明:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)