首页 | 归档 | 分类 | 标签 | 关于 |
|
短连接一般指的是,连接到数据库后,执行很少的 SQL 语句后就断开。下次需要的时候再重连。但是 MySQL 在建立连接的过程中,成本是很高的。除了正常的网络连接三次握手外,还需要做登陆权限判断和获得这个连接的数据读写权限。
MySQL 的 max_connections
参数用来控制一个 MySQL 实例同时存在的连接数的上限,超过这个值,系统就会拒绝接下来的连接请求,并报错提示 Too many connections
。对于被拒绝连接的请求来说,从业务角度看就是数据库不可用。
遇到大量短连接的场景,如果只是单纯调高 max_connections
的值,是不行的。因为设置 max_connections
这个参数的目的就是想保护 MySQL,如果把他改的太大,让更新的连接进来之后,系统的负载可能会进一步加大,大量的资源耗费在权限验证等逻辑上,结果可能是适得其反,已经连接的线程拿不到 CPU 资源去执行业务的 SQL 请求。
这里有两种方法,但是都是有损的。
max_connections
的计算是,只要客户端和服务端是连接着的就占用一个计数位置。
Explain 可以获取 MySQL 中 SQL 语句的执行计划,比如语句是否使用了关联查询、是否使用了索引、扫描行数等。可以帮我们选择更好地索引和写出更优的 SQL。使用方法:在 SQL 语句前面加上 explain 运行就可以了。
1 | mysql> explain select * from user where name = '6'; |
1 | CREATE TABLE `t` ( |
我们在 city 字段上加了索引,而 name 字段并没有索引。有如下的查找语句:
1 | select city,name,age from t where city='杭州' order by name limit 1000; |
MySQL 支持前缀索引,也就是说可以定义字符串的一部分作为索引。默认情况下,创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。
举个例子,我们的数据库表中有一个字段存储的邮箱地址,类型是字符串。
1 | alter table t add index index_1(email); |
前缀索引只取了字符串的一部分字节,因此索引占用的内存空间会变小,这是使用前缀索引的优势。但是可能会增加额外的记录扫描次数,因为可能多个字符串索引的前缀是相同的。