mysq積累

MySQL 用 limit 爲什麼會影響性能

表結構:

mysql> desc test;
+--------+---------------------+------+-----+---------+----------------+
| Field  | Type                | Null | Key | Default | Extra          |
+--------+---------------------+------+-----+---------+----------------+
| id     | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| val    | int(10) unsigned    | NO   | MUL | 0       |                |
| source | int(10) unsigned    | NO   |     | 0       |                |
+--------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

id爲自增主鍵,val爲非唯一索引。

 

灌入大量數據,共500萬:

mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
|  5242882 |
+----------+
1 row in set (4.25 sec)

 

我們知道,當limit offset rows中的offset很大時,會出現效率問題:

mysql> select * from test where val=4 limit 300000,5;
+---------+-----+--------+
| id      | val | source |
+---------+-----+--------+
| 3327622 |   4 |      4 |
| 3327632 |   4 |      4 |
| 3327642 |   4 |      4 |
| 3327652 |   4 |      4 |
| 3327662 |   4 |      4 |
+---------+-----+--------+
5 rows in set (15.98 sec)

 

爲了達到相同的目的,我們一般會改寫成如下語句:

mysql> select * from test a inner join (select id from test where val=4 limit 300000,5) b on a.id=b.id;
+---------+-----+--------+---------+
| id      | val | source | id      |
+---------+-----+--------+---------+
| 3327622 |   4 |      4 | 3327622 |
| 3327632 |   4 |      4 | 3327632 |
| 3327642 |   4 |      4 | 3327642 |
| 3327652 |   4 |      4 | 3327652 |
| 3327662 |   4 |      4 | 3327662 |
+---------+-----+--------+---------+
5 rows in set (0.38 sec)

時間相差很明顯。

分析:先查詢id字段做爲右表,然後進行內聯查詢

 

MySQL允許指定外部ip訪問權限

背景:公司的新項目mysql騰訊雲被外網攻擊,數據庫被刪除,並留下消息,要求我們轉0.6給比特幣給他,就把數據庫備份給我們。

初始化的mysql用戶權限只能localhost訪問,外部機器訪問需要添加權限:

mysql> Grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;

(%表示任意ip,如果指定ip,改爲對應ip即可;‘root’是指要使用的用戶名)

mysql> flush privileges;  (刷新權限,或者重啓mysql)

Grant all privileges on *.* to 'root'@'%' identified by '123' with grant option;

2 設置指定ip訪問mysql數據庫

GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.251.226.172' IDENTIFIED BY 'czp' WITH GRANT OPTION;
flush privileges;

第一行中,10.251.226.172是阿里雲內網的一個地址,這個是允許遠程訪問的IP的值。自行改爲其他值。root是賬戶名,後面的czp是密碼。即,允許來自10.251.226.172的連接並使用root賬戶和czp這個密碼進行訪問。ALL PRIVILEGES ON 後面的*.*表示所有數據庫,即完全訪問權限,可以指定爲特定數據庫。而IP這裏,可以使用%來表示所有IP。

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