工作中常用sql寶典以及優化方案

#### 1. MySQL Client登錄
```shell
mysql -h 127.0.0.01 -P 3306 -u root -p -Dmifm_backend --default-character-set=utf8
```

#### 2. 數據庫操作
命令 | 描述
:----|:----
create database db_name; | 創建數據庫
drop database db_name; | 刪除數據庫
show databases; | 顯示所有數據庫
use db_name | 連接數據庫db_name

#### 3. 表操作
命令 | 描述
:----|:----
create table tb_name(<字段名><類型>,...); | 創建表
desc tb_name; | 顯示錶結構
show create table tb_name; | 顯示建表語句,索引,存儲引擎,最大自增
drop table tb_name; | 徹底刪除表
truncate table tb_name; | 刪除表數據,保留表結構,自增歸零
delete from tb_name; | 刪除表數據,保留表結構,自增不歸零,慢
update cms_categories set s_type='ios' where id=18; | 數據更新
update et_album_categories e, cms_categories c set e.name=c.name,e.intro=c.introduction,e.order_id=c.order_id,e.pid=c.pid where e.id=c.id; | 不同表對應更新
insert into tb_name (...) values (...),...(...); | 數據插入
insert into et_album_categories (id, name, intro, order_id, pid, status,create_at,update_at) select id,name,introduction,order_id,pid,status,now(),now() from mifm.cms_categories where c_type='album'; | 數據導入
insert into player_count(player_id,count) value(1,1) on duplicate key update count=count+1; | 存在更新,不存在插入

#### 4. 表查詢
命令 | 描述
:----|:----
select title, count(title) num from cms_audios where album_id_id = 76 group by title having num>1; | 分組查詢
select distinct cp_name from cms_albums; | 去重查詢
select count(distinct id) from mcs_albums; | 統計查詢
select title from cms_albums where id in (select id from cms_albums where id>100); | 子查詢
select id from cms_audios where title in (select a.title from (select title, count(title) num from cms_audios where album_id_id = 76 group by title having num>1)a); | 查詢同一個專輯中名稱重複的音頻

#### 5. 索引
##### 1. 創建索引
    創建普通索引,唯一索引,主鍵,index_name可缺省,column_list可以爲多個逗號分隔
```sql
ALTER TABLE table_name ADD INDEX index_name (column_list);
ALTER TABLE table_name ADD UNIQUE (column_list);
ALTER TABLE table_name ADD PRIMARY KEY (column_list);
```
##### 2. 刪除指定索引
```sql
ALTER TABLE table_name DROP INDEX index_name;
```
##### 3. 刪除主鍵
    主鍵唯一不需要指定,如無主鍵則刪除第一個唯一索引,所列組合索引如刪除某列則整個索引被刪除
```sql
ALTER TABLE table_name DROP PRIMARY KEY;
```

##### 4. 查看索引
```sql
show index from tblname;
```

#### 6. 表字段增刪改
##### 1. 添加字段
```sql
ALTER TABLE et_album_chapters ADD column play_type varchar(50) default '';
alter table cms_categories add s_type enum('all', 'android', 'ios') default 'android'; 
alter table et_album_albums add column cp_avatar varchar(500) default '' after cp_star;
```

##### 2. 刪除字段
```sql
ALTER TABLE et_album_albums DROP order_id;
```

##### 3. 修改字段類型
```sql
ALTER TABLE et_album_chapters MODIFY play_type varchar(100);
```

##### 4. 修改默認值
```sql
ALTER TABLE et_album_chapters ALTER column play_type set default 'DB';
```

##### 5. 刪除字段默認值
```sql
ALTER TABLE et_album_chapters ALTER column play_type drop default;
```

##### 6. 更改表名
```sql
ALTER TABLE et_album_albums RENAME to erting_albums;
```

#### 7. 數據導出恢復

##### 命令行執行SQL
```shell
mysql -h127.0.0.1 -P3306 -uroot -p -Dmifm_backend --default-character-set=utf8 -e "select * from cms_albums limit 1" > /tmp/album.txt
```

##### 數據庫備份
    不指定--tables則備份整個庫
    不指定--where則備份整合表,--where語句必須在指定表時可用
```shell
mysqldump --skip-lock-tables --default-character-set=utf8 -h 127.0.0.1 -P 3306 -u root -p --databases db1 --tables a1 --where='id=1'  > /tmp/db1.sql
```
##### 數據恢復
```sql
mysql> source /tmp/db1.sql
```

#### 8. 常用字符串函數
##### REPLACE(srt,from_str,to_str)
    返回字符串str,其字符串from_str的所有出現由字符串to_str代替
```sql
mysql> select replace('Eason', 'a', 'di');
+-----------------------------+
| replace('Eason', 'a', 'di') |
+-----------------------------+
| Edison                      |
+-----------------------------+
```
##### REPEAT(str,count)
    返回由重複countTimes次的字符串str組成的一個字符串。如果count <= 0,返回一個空字符串。如果str或count是NULL,返回NULL
```sql
mysql> select repeat('fan',3);
+-----------------+
| repeat('fan',3) |
+-----------------+
| fanfanfan       |
+-----------------+
```
##### REVERSE(str)
    返回顛倒字符順序的字符串str
```sql
mysql> select reverse('fanjr');
+------------------+
| reverse('fanjr') |
+------------------+
| rjnaf            |
+------------------+
```
##### INSERT(str,pos,len,newstr)
    返回字符串str,在位置pos起始的子串且len個字符長得子串由字符串newstr代替,索引從1開始
```sql 
mysql> select insert('fanjunrui', 4,7,'jr');
+-------------------------------+
| insert('fanjunrui', 4,7,'jr') |
+-------------------------------+
| fanjr                         |
+-------------------------------+
```
##### TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
    返回字符串str,其所有remstr前綴或後綴被刪除了。如果沒有修飾符BOTH、LEADING或TRAILING給出,BOTH被假定。如果remstr沒被指定,空格被刪除
```sql
mysql> select trim(leading '*' from '***jay**');
+-----------------------------------+
| trim(leading '*' from '***jay**') |
+-----------------------------------+
| jay**                             |
+-----------------------------------+

mysql> select trim('*' from '**jay**');
+--------------------------+
| trim('*' from '**jay**') |
+--------------------------+
| jay                      |
+--------------------------+

mysql> select trim(trailing '*' from '**jay**');
+-----------------------------------+
| trim(trailing '*' from '**jay**') |
+-----------------------------------+
| **jay                             |
+-----------------------------------+
```
##### LENGTH(str)
    返回字符串長度
```sql 
mysql> select length('mifm');
+----------------+
| length('mifm') |
+----------------+
|              4 |
+----------------+
```
##### CONCAT(str1,str2,...)
    合併字符串
```sql 
mysql> select concat('QT','_','65535');
+--------------------------+
| concat('QT','_','65535') |
+--------------------------+
| QT_65535                 |
+--------------------------+
```

#### 9. 常用數字函數

函數名 | 描述 
:----|:----
AVG(x) | 返回平均值
SUN(x) | 返回字段總和
MAX(x) | 返回最大值
MIN(x) | 返回最小值

```sql
mysql> select avg(id),sum(price_cents),max(update_at),min(update_at) from et_album_albums;
+------------+------------------+---------------------+---------------------+
| avg(id)    | sum(price_cents) | max(update_at)      | min(update_at)      |
+------------+------------------+---------------------+---------------------+
| 26032.7583 |         11491773 | 2019-03-05 09:17:42 | 2018-11-26 11:17:38 |
+------------+------------------+---------------------+---------------------+
```

#### 10. 常用時間函數
函數名 | 描述 
:----|:----
CURDATE() | 返回當前日期 
CURTIME() | 返回當前時間
NOW() | 返回日期和時間

```sql 
mysql> select curdate(), curtime(), now();
+------------+-----------+---------------------+
| curdate()  | curtime() | now()               |
+------------+-----------+---------------------+
| 2019-03-09 | 14:18:43  | 2019-03-09 14:18:43 |
+------------+-----------+---------------------+
```

#### 11. MySQL優化
##### LIMIT優化
```sql
SELECT id,cp_name,title,seconds,cp_original_audio_id,fee_type,update_at,cp_time FROM cms_audios INNER JOIN (SELECT id from cms_audios WHERE  album_id_id=2992 AND status='online' ORDER BY order_id LIMIT 20000,20) AS t USING(id);
``` 

- 使用join,相當於先使用偏移量查詢出音頻id,使用id直接查詢所需偏移量專輯

```sql
SELECT id,cp_name,title,seconds,cp_original_audio_id,fee_type,update_at,cp_time FROM cms_audios WHERE  album_id_id=2992 AND status='online' ORDER BY order_id LIMIT 0,20;
```
- 這種直接limit會把所有limit的專輯查出後執行偏移量

##### 查詢優化

1、需求
     新網盟有一個需求,需要order表和extend表連表查詢,由於數據量巨大查詢速度相當慢,而實際上取到的數據並不多。即使每次只取24小時內數據,依然緩慢。
2、方案
    最後選擇的方法是放棄連表查詢,先從order表取出數據,在一條條從extend表讀取。
    雖然從order表取得的數據集會大,從extend表一條條讀取也不不見的理想,但是對於這種相對小量的數據,該方法依然比連表有優勢。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章