sql之常用命令

  • 查询某个库中 包含某个字段的所有表

MySQL的information_schema库中有个COLUMNS表,里面记录了mysql所有库中所有表的字段信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

SELECT DISTINCT
TABLE_NAME
FROM
information_schema.`COLUMNS`
WHERE
COLUMN_NAME = 'catid'
AND TABLE_SCHEMA = 'mks_ue163_com'
AND TABLE_NAME NOT LIKE 'vm%';

-- 通用模板
SELECT
table_name
FROM
information_schema.TABLES
WHERE
table_schema = 'dbName'
AND table_type = 'base table'
AND TABLE_NAME NOT IN ( SELECT DISTINCT TABLE_NAME FROM information_schema.COLUMNS WHERE COLUMN_NAME = 'culumnName' AND TABLE_SCHEMA = 'dbName' AND TABLE_NAME NOT LIKE 'vw%' );


-- 例如:查询数据库【fengchen】中表里没有字段【id】的所有表
SELECT
table_name
FROM
information_schema.`TABLES`
WHERE
TABLE_SCHEMA = 'fengchen'
AND TABLE_TYPE = 'base table'
AND TABLE_NAME NOT IN ( SELECT DISTINCT TABLE_NAME FROM information_schema.`COLUMNS` WHERE COLUMN_NAME = 'id' AND TABLE_SCHEMA = 'fengchen' AND TABLE_NAME NOT LIKE 'vm' )

索引

1
2
3
4
5
6
7
8
9
10
11
索引的坑



既然索引这么好,我们是不是应该尽可能多用索引呢?并不是。



首先,不要盲目的创建索引,应只为那些查询操作频繁的列创建索引,创建索引会使查询操作变得更加快速,但是会降低增加、删除、更新操作的速度,因为执行这些操作的同时会对索引文件进行重新排序或更新;

其次,在互联网应用中,查询的语句远远大于DML的语句,为一个大表(比如千万级数据)新建索引时是一个需要特别慎重的事情,经常出现“翻车”导致“车毁人亡”的事故,为什么?因为线上系统在被人使用,如果这时候开发或者运维人员执行一个创建索引的语句,容易导致表被锁死,所有操作排队无法被响应,时间一长容易导致业务崩溃,形成链式连锁反应,让业务蒙受巨大损失。百万或千万级数据库,大表加索引有一个比较好的方法:online-schema-change,有兴趣可自行网上搜索,此文不再赘述。