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。

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