说明:最近工作上遇到一个问题,由于子表数据最较多,但也不是太多,我看了下也就几百万行的。说是主表中一行数据对应了子表中多行数据,所以删除的时候就非常的慢,于是就改成了业务删除时只删除主表的记录,并将该id记录下来,然后再跑一个定时任务去删除子表里面的数据。这样业务删除的时候速度就快起来了,让我完成定时任务里面的逻辑处理。我拿到数据后发现关联字段,也就是子表中指向主表的那个字段,比如我们公司常用的busId由于不是子表的主键,所以没有任何索引,因此查询或关联的时候速度也慢下来了。加上索引后速度就提起来了,为了能从java代码中检查该列是否已经有了索引,所以找到了如下的文章

原文连接:https://blog.51cto.com/zhezhebie/5443768?abTest=51cto

mysql查看所有表的索引:

SELECT a.TABLE_SCHEMA,
a.TABLE_NAME,
a.index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) AS `Columns`
FROM information_schema.statistics a
GROUP BY a.TABLE_SCHEMA,a.TABLE_NAME,a.index_name

查询索引:

select * from (SELECT a.TABLE_SCHEMA,
a.TABLE_NAME,
a.index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) AS `Columns`
FROM information_schema.statistics a
GROUP BY a.TABLE_SCHEMA,a.TABLE_NAME,a.index_name) as b where b.index_name like '%req_id_3%'

查看单个表索引信息:

mysql> show keys from table_name;

结果列表中各字段的含义:
Non_unique:如果索引不能包括重复词,则为0。如果可以,则为1。
Key_name:索引的名称。
Seq_in_index:索引中的列序列号,从1开始。
Column_name:列名称。
Collation:列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。
Cardinality:索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。
Sub_part:如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。

Packed: 指示关键字如何被压缩。如果没有被压缩,则为NULL。
Null: 如果列含有NULL,则含有YES。如果没有,则该列含有NO。
Index_type:用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。

Logo

本社区面向用户介绍CSDN开发云部门内部产品使用和产品迭代功能,产品功能迭代和产品建议更透明和便捷

更多推荐