MySQL整理


一、mysql查询所有索引,删除所有索引,重建所有索引

查询索引

SELECT
     *
FROM
     INFORMATION_SCHEMA.STATISTICS
WHERE
     TABLE_SCHEMA = '库名';
#或者使用查看表的索引
(1)show index from tblname;
(2)show keys from tblname;

创建索引

执行CREATE TABLE语句可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。

ALTER TABLE
ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。

(1.)ALTER TABLE table_name ADD INDEX index_name (column_list)
(2.)ALTER TABLE table_name ADD UNIQUE (column_list)
(3.)ALTER TABLE table_name ADD PRIMARY KEY (column_list)

其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。

CREATE INDEX
CREATE INDEX可对表增加普通索引或UNIQUE索引。

(1)CREATE INDEX index_name ON table_name (column_list)
(2)CREATE UNIQUE INDEX index_name ON table_name (column_list)

table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。

删除索引

(1)DROP INDEX index_name ON talbe_name
(2)ALTER TABLE table_name DROP INDEX index_name
(3)ALTER TABLE table_name DROP PRIMARY KEY

其中,前两条语句是等价的,删除掉table_name中的索引index_name。
第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。

批量删除所有索引

MYSQL索引信息存储在INFORMATION_SCHEMA.STATISTICS表里,如
果要批量删除索引(主键除外)则可通过其构建批量删除sql
#拼接删除索引的语法
SELECT CONCAT('ALTER TABLE ',i.TABLE_NAME,' DROP INDEX ',i.INDEX_NAME,' ;') 
FROM INFORMATION_SCHEMA.STATISTICS i
#过滤主键索引
WHERE TABLE_SCHEMA = '库名' AND i.INDEX_NAME <> 'PRIMARY';
 
#拼接删除索引的语法
SELECT i.TABLE_NAME, i.COLUMN_NAME, i.INDEX_NAME, 
CONCAT('ALTER TABLE ',i.TABLE_NAME,' DROP INDEX ',i.INDEX_NAME,' ;') 
FROM INFORMATION_SCHEMA.STATISTICS i
#过滤主键索引
WHERE TABLE_SCHEMA = 'myemployees' AND i.INDEX_NAME <> 'PRIMARY';

#去重
SELECT DISTINCT
CONCAT('ALTER TABLE ',i.TABLE_NAME,' DROP INDEX ',i.INDEX_NAME,' ;') 
FROM INFORMATION_SCHEMA.STATISTICS i
WHERE TABLE_SCHEMA = '库名' AND i.INDEX_NAME <> 'PRIMARY'
 
#-------------
 
#拼接删除索引的语法
SELECT i.TABLE_NAME, i.COLUMN_NAME, i.INDEX_NAME, 
CONCAT('ALTER TABLE ',i.TABLE_NAME,' DROP INDEX ',i.INDEX_NAME,' ;') 
FROM INFORMATION_SCHEMA.STATISTICS i
#过滤主键索引
#过滤库和表
WHERE TABLE_SCHEMA = 'myemployees' AND TABLE_NAME = 'book' AND i.INDEX_NAME <> 'PRIMARY';

二、delete方式

https://blog.csdn.net/weixin_42056745/article/details/103804230

三 exist 和 in 却别

 select    *      from   a     where    id    in  (select  id  from  b) ;    
 select    *      from   a     where    id    exists  (select  id  from  b) ;    

使用in ,sql语句是先执行子查询,也就是先查询b表,在查a表,
而使用exists是先查主表a ,再查字表b; 对于主表数据较多时,
我们使用in速度比exist更快,反之,从表b较大时,使用exist插叙速度更快(都会使用索引),
如果使用的是not in与not exists,直接使用not exists,因为not in 会进行全表扫描
不走索引,not exists会走索引。

1.select * from A where A.id in (select AId from B )
2.select * from A where A.id exits (select * from B where B.AId = A.id )

1的过程类似于:

Array B=select AId from B;
for(b:B){
  select * from A where A.id = b;
}

走的是A的索引,in所以适合数据量A>B的情况
2的过程类似于:

Array A = select * from A;
for(a:A){
  select * from B where B.AId = a.id
}

走的是B的索引,所以适合数据量B>A的情况

mybatis中insert语句动态sql,表默认值生效

https://blog.csdn.net/weixin_43171019/article/details/84641583
https://www.cnblogs.com/wx60079/p/13206011.html?utm_source=tuicool

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值