首页 欧洲联赛正文

95518,mysql特别注意,查询速度0.5秒左右,亚洲情色电影

一:MySQL功能

最大数据量

最大并发数

查询耗时0.5秒

施行准则

二:数据表规划

数据类型

防止空值

text类型

三:索引优化

索引分类

优化准则

四:SQL优化

分批处理

不做列运算

防止Select *

操作符<>优化

OR优化

IN优化

LIKE优化

JOIN优化

LIMIT优化

五:其他数据库

博主担任的项目首要选用阿里云数据库MySQL,最近频频呈现慢SQL告警,履行时刻最长的居然高达5分钟。导出日志后剖析,首要原因居然是没有射中索引和没有分页处理。其实这是十分初级的过错,我不由后背一凉,团队成员的技术水平亟待进步啊。改造这些SQL的过程中,总结了一些经历共享给咱们,假如有过错欢迎批评指正。

# MySQL功能

最大数据量

抛开数据量和并发数,谈功能都是耍流氓。MySQL没有束缚单表最大记载数,它取决于操作体系对文件巨细的束缚。

文件体系单文件巨细束缚FAT32

最大4G

NTFS

最大64GB

NTFS5.0

最大2TB

EXT2

块巨细为1024字节,文件最大容量16GB;

块巨细为4096字节,文件最大容量2TB

EXT3

块巨细为4KB,文件最大容量为4TB

EXT4

理论能够大于16TB

《阿里巴巴Java开发手册》提出单表行数超越500万行或许单表容量超越2GB,才引荐分库分表。功能由归纳要素决议,抛开事务杂乱度,影响程度依次是硬件装备、MySQL装备、数据表规划、索引优化。500万这个值仅供参考,并非铁律。博主从前操作过超越4亿行数据的单表,分页查询最新的20条记载耗时0.6秒,SQL语亲吻相片句大致是


select field_1,field_2 from table where id < #{prePageMinId} order by id desc limit 20

prePageMinId是上一页数据记载的最小ID。尽管其时查询速度还将就,跟着数据不断添加,有朝一日必定不堪重负。分潘晓婷的老公库分表是个周期福利区长而危险高的大活儿,应该尽或许在当时结构上优化,比方晋级硬件、搬迁历史数据等等,真实没辙了再分。对分库分表感兴趣的同学能够阅览分库分表的基本思想。

最大并发数

并发数是指同一时刻数据库能处理多少个恳求,由max_connections和max_user_connections决议。max_connections是指MySQL双狮地球牌实例的最大衔接数,上限值是16384,max_user_conn95518,mysql特别注意,查询速度0.5秒左右,亚洲情色电影ec95518,mysql特别注意,查询速度0.5秒左右,亚洲情色电影tions是指每个数据库用户的最大衔接数。MySQL会为每个衔接供给缓冲区,意味着耗费更多的内存。假如衔接数设置太高硬件吃不消,太低比你打又点又不能充分运用硬件。一般要求两者比值超越10%,核算办法如下:


max_used_connections / max_connections * 100% = 3/100 *100% ≈ 3%

检查最大衔接数与呼应最大衔接数:


show variables like '%max_connections%';

show variables like '%max_user_connections%';

在装备文件my.cnf中修正最大衔接数


[mysqld]

max_connections = 100

max_used_connections = 20

查询耗时0.5秒

主张将单次查询耗时控制在0.5秒以内,0.5秒是个经历值,源于用户体会的3秒准则。假如用户的操作3秒内没有呼应,将会厌烦乃至退出。呼应时刻=客户端UI烘托耗时+网络恳求耗时+应用程序处理耗时+查询数据库耗时,0.5秒便是留给数据库1/6的处理时刻。

施行准则

比较NoSQL数据库,MySQL是个娇气软弱的家伙。它就像体育课上的女同学,一点胶葛就和同学闹别扭(扩容难),跑两步就气喘吁吁(容量小并发低),常常身体不适要请假(SQL束缚太多)。现在咱们都会搞点散布式,应用程序扩容比数据库要简略得多,所以施行准则是数据库少干活,应用程序多干活。

1.充分运用但不乱用索引,须知索引也耗费磁盘和CPU世界大师时装画。

2.不引荐运用数据库函数格式化数据,交给应用程序处理。

3.不引荐运用外键束缚,用应用程序确保数据准确性。

4.写多读少的场景,不引荐运用仅有索引,用应用程序确保仅有性。

5.恰当冗余字段,测验创立中心表,用应用程序核算中心成果,用空间换时刻。

6.不答应履行极度耗时的事务,合作应用程序拆分红更小的事务。

7.预估重要数据表(比方订单表)的负载和数据添加态势,提早优化。

# 数据表规划

数据类型

数据类型的挑选准则:更简略或许占用空间更小。

1.假如长度能够满意,整型尽量运用tinyint、smallint、medium_int而非int。

2.假如字符串长度确认,选用char类型。

3.假如varchar能够满意,不选用text类型。

4.精度要求较高的运用decimal类型,也能够运用BIGINT,比方准确两位小数就乘以100后保存。

5.尽量选用timestamp而非datetime。

类型占有字节描绘datetime

8字节

'1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999程开耀999

timestamp

4字节

'1榞祈970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999'

比较datetime,timestamp占用更少的空间,以UTC的格中国武术散打功夫王争霸赛式贮存主动转化时区。

防止空值

MySQL中字段为NULL时仍然占用空间,会使索引、索引计算愈加杂乱。从NULL值更新到非NULL无法做到原地更新,简略发生索引割裂影响功能。尽或许将NULL值用有意义的值替代,也能防止SQL句子里边包括is not null的判别。

text类型优化

因为text字段贮存许多数据,表容量会很早涨上去,影响其他字段的查询功能。主张抽取出来放在子表里,用事务主键相关。

# 索引优化

索引分类

1.一般索引:最基本的索引。

2.组合索引:多个字段上树立的索引,能够加快复合查询条件的检索。

3.仅有索引:与一般索引相似,但索引列的值有必要仅有,答应有空值。

4.组合仅有索引:列值的组合有必要仅有。

5.主键索引:特别的仅有索引,用于仅有标识数据表中的某一条记载,不答应有空值,一般用primary key束缚。

6.全文索引:用于海量文本的查询,MySQL5.6之后的InnoDB和MyISAM均支撑95518,mysql特别注意,查询速度0.5秒左右,亚洲情色电影全文索引。因为查询精度以及扩展性欠安,更多的企业挑选Elasticsearch。

索引优化

1.分页查询很重要,假如查询数据量超越30%,MYSQL不会运用索引。

2.单表索引数不超越5个、单个索引字段数不超越5个。

3.字符串可运用前缀索引,前缀长度控制在5-8个字符。

4.字段仅有性太低,添加索引没有意义,如:是否删去、性别。

5.合理运用掩盖索引,如下所示:


select login_name, nick_name from member where login_name = ?

login_name, nick_name两个字段树立组合索引,比login_name简略索引Psiphon要更快

# SQL优化

分批处理

博主小时分看到鱼塘挖开小口儿放水,水面有各种漂浮物。浮萍和树叶总能顺畅经过出水口,而树枝会挡住其他物体经过,有时还会卡住,需求人工整理。

MySQL便是鱼塘,最大并发数和网络带宽便是出水口,用户SQL便是漂浮物。不带分页参数的查询或许影响许多数据的update和delete操作,都是树枝,咱们要把它打散分批处理,举例说明:

事务描绘:更新用户一切已过期95518,mysql特别注意,查询速度0.5秒左右,亚洲情色电影的优惠券为不可用状况。

SQL句子:


update status=0 FROM `coupon` WHERE expire_date <= #{currentDate} and status=1;

假如许多优惠券需求更新为不可用状况,95518,mysql特别注意,查询速度0.5秒左右,亚洲情色电影履行这开国将军任荣谢世条SQL或许会堵死其他SQL,分批处理伪代码如下:


int pageNo = 1;

int PAGE_SIZE = 100;

while(true) {

List batchIdList = queryList('select id FROM `coupon` WHERE expire_date <= #{currentDate} and status = 1 limit #{(pageNo-1) * PAGE_SIZE},#{PAGE_SIZE}');

if (CollectionUtils.isEmpty(batchIdList)) {

return;

}

update('update status = 0 FROM `coupon` where status = 1 and id in #{batchIdList}')

pageNo ++;

}

操作符<>优化

一般<>操作符无法运用索引,举例如下,查询金额不为100元的订单:


select id from orders where amount != 100;

假如金额为100的订单很少,这种数据散布严峻不均的情况下,有或许运用索引。鉴于这种不确认性,选用union聚合查找成果,改写办法如下:


(select id from orders where amount > 100)

union all

(select id from orders where amount < 100 and amount > 0)

OR优化

在Innodb引擎下or无法运用组合索引,比方:


select id,product_name 95518,mysql特别注意,查询速度0.5秒左右,亚洲情色电影from orders where mobile_no = '13421800407' or user_id = 100;

OR无法射中mobile_no + user_id的组合索引,可选用union,如下所示:


(select id,product_name from orders where mobile_no = '13421800407')

union

(select id,prod郑殿增uct_name from orders where user_id = 100);

此刻id和product_name字段都有索引,查询才最高效。

IN优化

1.IN合适主表大子表小,EXIST合适主表小子表大。因为查询优化器的不断晋级,许多场景这两者功能差不多相同了。

2.测验改为join查询,举例如下:


select id from orders where user_id in (select id from user where level聂祥芝 = 'VIP');

选用JOIN如下所示:


select o.id from orders o left join user u on o.user_id = u.id where u.level = 'VIP';

不做列运算

一般在查询条件列运算会导致索引失效,如下所示:

查询当日订单


select id from order where date_format(create_time,'%Y-%m-%d') = '2019-07-01';

date_format函数会导致这个查询无法使德阳常蕾用索引,改写后:


select id from order where create_time between '2019-07-01 00:00:00' and '2019-07-01 23:59:59';

防止Select all

假如不查询表中一切的列,防止运用SELECT *,它会进行全表扫描,不能有用运用索引。

Like优化

like用于含糊查询,举个比如(field已树立索引):


SELECT column FROM table WHERE field like '%keyword%';

这个查询未射中索引,换成下面的写法:


SEL虞山镇漕泾2区ECT column FROM table WHERE field like 'keyword%';

去除了前面的%查询将会射中索引,可是产品司理一定要前后含糊匹配呢?全蔡奉芸文索引fulltext能够测验一下,但Elasticsearch才是终极兵器。

Join优化

join的完成是选用Nested Loop Join算法,便是经过驱动表的成果集作为基础数据,经过该结数据作为过滤条件到下一个表中循环查询数据,然后兼并成果。假如有多个join,则将前面的成果集作为循环数据,再次到后一个表中查询数据。

1.驱动表和被驱动表尽藏王刀或许添加查询条件,满意ON的条件而少用Where,用小成果集驱动大成果集。

3.被驱动表的join字段上加上索引,无法树立索引的时分,设置满足的Jo极度深寒2深海惊变in Buffer Size。

3.制止join衔接三个以上的表,测验添加冗余字段。

Limit优化

limit用于分页查询时越往后翻功能越差,处理的准则:缩小扫描规模,如下所示:


select * from orders order by id desc limit 100000,10

耗时0.4秒

select * from orders order by id desc limit 1000000,10

耗时5.2秒

先筛选出ID缩小查询规模,写法如下:


select * from orders where id > (select id from orders or95518,mysql特别注意,查询速度0.5秒左右,亚洲情色电影der by id desc limit 1000000, 1) 子午鸳鸯芯order by id desc limit 0,10

耗时0.5秒

假如查询条件仅有主键ID,写法如下:


select id from orders where id between 1000000 and 1000010 order by id desc

耗时0.3秒

假如以上计划仍然很慢呢?只好用游标了,感兴趣的朋友阅览JDBC运用游标完成分页查询的办法

# 其他数据库

作为一名后端开发人员,必须通晓作为存储中心的MySQL或SQL Server,也要积极关注NoSQL数据库,他们现已满足老练并被广泛选用,能处理特定场景下的功能瓶颈。

分类数据库特性键值型

Memcache

用于内容缓存,许多数据的高拜访负载

键值型

Redis

用于内容缓存,比Memcache支撑更多的数据类型,并能耐久化数据

列式存储

HBase

Hadoop体系的中心数据库,海量结构化数据存储,大数据必备。

文档型

MongoDb

闻名文档型数据库,也能够用于缓存

文档型

CouchDB

Apache的开源项目,专心于易用性,支撑REST API

文档型

SequoiaDB

国内闻名文档型数据库

图形

Neo4J

用于交际网络构建联系图谱,引荐体系等

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。