myusql 性能优化2

优化SQL语句的一般步骤

通过show status命令了解各种SQL的执行频率

?


1

mysql> show [session|global]status;

其中:session(默认)表示当前连接,global表示自数据库启动至今

?


1

2

3

4


mysql>show status;

mysql>show global status;

mysql>show status like ‘Com_%‘;

mysql>show global status like ‘Com_%‘;

参数说明:

Com_XXX表示每个XXX语句执行的次数如:
Com_select 执行select操作的次数,一次查询只累计加1
Com_update 执行update操作的次数
Com_insert 执行insert操作的次数,对批量插入只算一次。
Com_delete 执行delete操作的次数
只针对于InnoDB存储引擎的:

InnoDB_rows_read 执行select操作的次数
InnoDB_rows_updated 执行update操作的次数
InnoDB_rows_inserted 执行insert操作的次数
InnoDB_rows_deleted 执行delete操作的次数
其他:

connections 连接mysql的数量
Uptime 服务器已经工作的秒数
Slow_queries:慢查询的次数

优化SQL语句的一般步骤

通过show status命令了解各种SQL的执行频率

?


1

mysql> show [session|global]status;

其中:session(默认)表示当前连接,global表示自数据库启动至今

?


1

2

3

4


mysql>show status;

mysql>show global status;

mysql>show status like ‘Com_%‘;

mysql>show global status like ‘Com_%‘;

参数说明:

Com_XXX表示每个XXX语句执行的次数如:
Com_select 执行select操作的次数,一次查询只累计加1
Com_update 执行update操作的次数
Com_insert 执行insert操作的次数,对批量插入只算一次。
Com_delete 执行delete操作的次数
只针对于InnoDB存储引擎的:

InnoDB_rows_read 执行select操作的次数
InnoDB_rows_updated 执行update操作的次数
InnoDB_rows_inserted 执行insert操作的次数
InnoDB_rows_deleted 执行delete操作的次数
其他:

connections 连接mysql的数量
Uptime 服务器已经工作的秒数
Slow_queries:慢查询的次数
定位执行效率较低的SQL语句

?


1

2


explain select * from table where id=1000;

desc select * from table where id=1000;

通过EXPLAIN分析较低效SQL的执行计划

?


1

2

3

4

5

6

7

8

9

10

11

12

13


mysql> explain select count(*) from stu where name like "a%"\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: stu

type: range

possible_keys: name,ind_stu_name

key: name

key_len: 50

ref: NULL

rows: 8

Extra: Using where; Using index

1 row in set (0.00 sec)

每一列的简单解释

id: 1
select_type: SIMPLE
表示select的类型,常见的取值有SIMPLE()简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、
UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个SESECT)等
table: stu  输出结果集的表
type: range
表示表的连接类型,性能有好到差:system(表仅一行)、const(只一行匹配)、eq_ref(对于前面的每一行使用主键和唯一)、ref(同
eq_ref,但没有使用主键和唯一)、ref_or_null(同前面对null查询)、index_merge(索引合并优化)、
unique_subquery(主键子查询)、index_subquery(非主键子查询)、range(表单中的范围查询)、index(都通过查
询索引来得到数据)、all(通过全表扫描得到的数据)
possible_keys: name,ind_stu_name 表查询时可能使用的索引。
key: name  表示实际使用的索引。
key_len: 50 索引字段的长度
ref: NULL
rows: 8 扫描行的数量
Extra: Using where; Using index 执行情况的说明和描述

索引问题

MyISAM存储引擎的表的数据和索引是自动分开存储的,各自是独一的一个文件;InnoDB存储引擎的表的数据和索引是存储在同一个表空间里面,
但可以有多个文件组成。MySQL目前不支持函数索引,但是能对列的前面某一部分进行索引,例如name字段,可以只取name的前4个字符进行索引,这
个特性可以大大缩小索引文件的大小,用户在设计表结构的时候也可以对文本列根据此特性进行灵活设计。

?


1

mysql>create index ind_company2_name on company2(name(4));

--其中company表名ind_company2_name索引名
MySQL如何使用索引
1、使用索引

(1)对于创建的多列索引,只要查询的条件中用到最左边的列,索引一般就会被使用。如下创建一个复合索引。

?


1

mysql>create index ind_sales2_com_mon on sales2(company_id,moneys);

然后按company_id进行查询,发现使用到了复合索引

?


1

mysql>explain select * from sales2 where company_id=2006\G

使用下面的查询就没有使用到复合索引。

?


1

mysql>explain select * from sales2 where moneys=1\G

(2) 使用like的查询,后面如果是常量并且只有%号不在第一个字符,索引才可能会被使用,如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13


mysql> explain select * from company2 where name like "%3"\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: company2

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 1000

Extra: Using where

1 row in set (0.00 sec)

如下这个使用到了索引,而下面例子能够使用索引,区别就在于“%”的位置不同,上面的例子是吧“%”放在了第一位,而下面的例子则没有

?


1

2

3

4

5

6

7

8

9

10

11

12

13


mysql> explain select * from company2 where name like "3%"\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: company2

type: range

possible_keys: ind_company2_name

key: ind_company2_name

key_len: 11

ref: NULL

rows: 103

Extra: Using where

1 row in set (0.00 sec)

(3)如果对大的文本进行搜索,使用全文索引而不使用like“%...%”.

(4)如果列名是索引,使用column_name is null将使用索引。如下

?


1

2

3

4

5

6

7

8

9

10

11

12

13


mysql> explain select * from company2 where name is null\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: company2

type: ref

possible_keys: ind_company2_name

key: ind_company2_name

key_len: 11

ref: const

rows: 1

Extra: Using where

1 row in set (0.00 sec)

存在索引但不使用索引
(1)如果MySQL估计使用索引比全表扫描更慢,则不使用索引。例如如果列key_part1均匀分布在1到100之间,查询时使用索引就不是很好

?


1

mysql>select * from table_name where key_part1>1 and key_part<90;

(2)如果使用MEMORY/HEAP表并且where条件中不使用“=”进行索引列,那么不会用到索引。Heap表只有在“=”的条件下会使用索引。

(3)用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。

?


1

2

3

4

5

6

7


mysql>show index from sales\G

*************************** 1. row ***************************

……

key_name: ind_sales_year

seq_in_index:1

Column_name: year

……

从上面可以发现只有year列上面有索引。来看如下的执行计划。

?


1

2

3

4

5

6

7

8

9

10

11

12

13


mysql> explain select * from sales where year=2001 or country=‘China‘\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: sales

type: ALL

possible_keys: ind_sales_year

key: NULL

key_len: NULL

ref: NULL

rows: 12

Extra: Using where

1 row in set (0.00 sec)

(4)如果不是索引列的第一部分,如下例子:可见虽然在money上面建有复合索引,但是由于money不是索引的第一列,那么在查询中这个索引也不会被MySQL采用。

?


1

2

3

4

5

6

7

8

9

10

11

12

13


mysql> explain select * from sales2 where moneys=1 \G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: sales2

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 1000

Extra: Using where

1 row in set (0.00 sec)

(5)如果like是以%开始,可见虽然在name上面建有索引,但是由于where 条件中like的值的“%”在第一位了,那么MySQL也会采用这个索引。

(6)如果列类型是字符串,但在查询时把一个数值型常量赋值给了一个字符型的列名name,那么虽然在name列上有索引,但是也没有用到。

?


1

2

3

4

5

6

7

8

9

10

11

12

13


mysql> explain select * from company2 where name name=294\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: company2

type: ALL

possible_keys: ind_company2_name

key: NULL

key_len: NULL

ref: NULL

rows: 1000

Extra: Using where

1 row in set (0.00 sec)

而下面的sql语句就可以正确使用索引。

?


1

2

3

4

5

6

7

8

9

10

11

12

13


mysql> explain select * from company2 where name name=‘294‘\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: company2

type: ref

possible_keys: ind_company2_name

key: ind_company2_name

key_len: 23

ref: const

rows: 1

Extra: Using where

1 row in set (0.00 sec)

查看索引使用情况
如果索引正在工作,Handler_read_key的值将很高,这个值代表了一个行被索引值读的次数。

Handler_read_rnd_next的值高则意味着查询运行低效,并且应该建立索引补救。

?


1

2

3

4

5

6

7

8

9

10

11

12


mysql> show status like ‘Handler_read%‘;

+-----------------------+-------+

| Variable_name | Value |

+-----------------------+-------+

| Handler_read_first | 0 |

| Handler_read_key | 5 |

| Handler_read_next | 0 |

| Handler_read_prev | 0 |

| Handler_read_rnd | 0 |

| Handler_read_rnd_next | 2055 |

+-----------------------+-------+

6 rows in set (0.00 sec)

两个简单实用的优化方法

分析表的语法如下:(检查一个或多个表是否有错误)

?


1

2

3

4

5

6

7

8

9


mysql> CHECK TABLE tbl_name[,tbl_name] …[option] …option =

{ QUICK | FAST | MEDIUM| EXTENDED | CHANGED}

mysql> check table sales;

+--------------+-------+----------+----------+

| Table | Op | Msg_type | Msg_text |

+--------------+-------+----------+----------+

| sakila.sales | check | status | OK |

+--------------+-------+----------+----------+

1 row in set (0.01 sec)

优化表的语法格式:

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [,tbl_name]
如果已经删除了表的一大部分,或者如果已经对含有可变长度行的表进行了很多的改动,则需要做定期优化。这个命令可以将表中的空间碎片进行合并,但是此命令只对MyISAM、BDB和InnoDB表起作用。

?


1

2

3

4

5

6

7


mysql> optimize table sales;

+--------------+----------+----------+----------+

| Table | Op | Msg_type | Msg_text |

+--------------+----------+----------+----------+

| sakila.sales | optimize | status | OK |

+--------------+----------+----------+----------+

1 row in set (0.05 sec)

常用SQL的优化

大批量插入数据
当用load命令导入数据的时候,适当设置可以提高导入的速度。

对于MyISAM存储引擎的表,可以通过以下方式快速的导入大量的数据。

ALTER TABLE tbl_name DISABLE KEYS
loading the data
ALTER TABLE tbl_name ENABLE KEYS
DISABLE KEYS 和ENABLE KEYS 用来打开或关闭MyISAM表非唯一索引的更新,可以提高速度,注意:对InnoDB表无效。

--没有使用打开或关闭MyISAM表非唯一索引:

?


1

2

3


mysql> load data infile ‘/home/mysql/film_test.txt‘into table film_test2;

Query OK,529056 rows affected (1 min 55.12 sec)

Records:529056 Deleted:0 Skipped:0 Warnings:0

--使用打开或关闭MyISAM表非唯一索引:

?


1

2

3

4

5

6

7


mysql> alter table film_test2 disable keys;

Query OK,0 rows affected (0.0 sec)

mysql> load data infile ‘/home/mysql/film_test.txt‘into table film_test2;

Query OK,529056 rows affected (6.34 sec)

Records:529056 Deleted:0 Skipped:0 Warnings:0

mysql> alter table film_test2 enable keys;

Query OK,0 rows affected (12.25 sec)

--以上对MyISAM表的数据导入,但对于InnoDB表并不能提高导入数据的效率

(1)针对于InnoDB类型表数据导入的优化

因为InnoDB表的按照主键顺序保存的,所以将导入的数据主键的顺序排列,可以有效地提高导入数据的效率。

--使用test3.txt文本是按表film_test4主键存储顺序保存的

?


1

2


mysql> load data infile ‘/home/mysql/film_test3.txt‘into table film_test4;

Query OK, 1587168 rows affected (22.92 sec)

Records:1587168 Deleted:0 Skipped:0 Warnings:0
--使用test3.txt没有任何顺序的文本(效率慢了1.12倍)

?


1

2

3


mysql> load data infile ‘/home/mysql/film_test4.txt‘into table film_test4;

Query OK, 1587168 rows affected (31.16 sec)

Records:1587168 Deleted:0 Skipped:0 Warnings:0

(2)关闭唯一性效验可以提高导入效率

在导入数据前先执行set unique_checks=0,关闭唯一性效验,在导入结束后执行set unique_checks=1,恢复唯一性效验,可以提高导入效率。

--当unique_checks=1时

?


1

2

3


mysql> load data infile ‘/home/mysql/film_test3.txt‘into table film_test4;

Query OK,1587168 rows affected (22.92 sec)

Records:1587168 Deleted:0 Skipped:0 Warnings:0

--当unique_checks=0时

?


1

2

3


mysql> load data infile ‘/home/mysql/film_test3.txt‘into table film_test4;

Query OK,1587168 rows affected (19.92 sec)

Records:1587168 Deleted:0 Skipped:0 Warnings:0

(3)关闭自动提交可以提高导入效率

在导入数据前先执行set autocommit=0,关闭自动提交事务,在导入结束后执行set autocommit=1,恢复自动提交,可以提高导入效率。

--当autocommit=1时

?


1

2

3


mysql> load data infile ‘/home/mysql/film_test3.txt‘into table film_test4;

Query OK,1587168 rows affected (22.92 sec)

Records:1587168 Deleted:0 Skipped:0 Warnings:0

--当autocommit=0时

?


1

2

3


mysql> load data infile ‘/home/mysql/film_test3.txt‘into table film_test4;

Query OK,1587168 rows affected (20.87 sec)

Records:1587168 Deleted:0 Skipped:0 Warnings:0

优化insert语句
尽量使用多个值表的insert语句,这样可以大大缩短客户与数据库的连接、关闭等损耗。

可以使用insert delayed(马上执行)语句得到更高的效率。

将索引文件和数据文件分别存放不同的磁盘上。

可以增加bulk_insert_buffer_size 变量值的方法来提高速度,但是只对MyISAM表使用当从一个文件中装载一个表时,使用LOAD DATA INFILE。这个通常比使用很多insert语句要快20倍。

优化group by语句
如果查询包含group by但用户想要避免排序结果的损耗,则可以使用使用order by null来禁止排序:

如下没有使用order by null来禁止排序

?


1

2

3

4

5

6

7

8

9

10

11

12

13


mysql> explain select id,sum(moneys) from sales2 group by id\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: sales2

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 1000

Extra: Using temporary;Using filesort

1 row in set (0.00 sec)

如下使用order by null的效果:

?


1

2

3

4

5

6

7

8

9

10

11

12

13


mysql> explain select id,sum(moneys) from sales2 group by id order by null\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: sales2

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 1000

Extra: Using temporary

1 row in set (0.00 sec)

优化嵌套查询
下面是采用嵌套查询的效果(可以使用更有效的链接查询(Join)替代)。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26


mysql> explain select * from sales2 where company_id not in(select id

from company2)\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: sales2

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 1000

Extra: Using where

1 row in set (0.00 sec)

*************************** 2. row ***************************

id: 2

select_type: SIMPLE

table: company2

type: index_subquery

possible_keys: ind_company2_id

key: ind_company2_id

key_len: 5

ref: func

rows: 2

Extra: Using index

1 row in set (0.00 sec)

下面是使用更有效的链接查询(Join)

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26


mysql> explain select * from sales2 left join company2 on

sales2.company_id = company2.id where sales2.company_id is null\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: sales2

type: ALL

possible_keys: ind_sales2_companyid_moneys

key: ind_sales2_companyid_moneys

key_len: 5

ref: count

rows: 1

Extra: Using where

1 row in set (0.00 sec)

*************************** 2. row ***************************

id: 2

select_type: SIMPLE

table: company2

type: index_subquery

possible_keys: ind_company2_id

key: ind_company2_id

key_len: 5

ref: func

rows: 1

Extra:

1 row in set (0.00 sec)

从执行计划中可以明显看出查询扫描的记录范围和使用索引的情况都有了很大的改善。连接(JOIN)子所以更有效率一些,是因为MySQL不需要再内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。

数据库优化

优化表的类型
在MySQL中,可以使用函数PROCEDUREANALYSE()对当前应用的表进行分析,改函数可以对数据表中列的数据类型提出优化建议,用户可以根据应用的实际情况酌情考虑是否实施优化。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14


mysql> select * from duck_cust procedure analyse()\G

*************************** 1. row ***************************

Field_name: sakila.duch_cust.cust_num

Min_value: 1

Max_value: 6

Min_length: 1

Max_length: 1

Empties_or_zeros: 0

Nulls: 0

Avg_value_or_avg_length: 3.5000

Std: 1.7078

Optimal_fieldtype: ENUM(‘1‘,‘2‘,‘3‘,‘4‘) NOT NULL

*************************** 2. row ***************************

……

大存储量解决
1.分库分表

2.分区

主要目的:

1.减少表的记录数

2.减小对操作系统的负担压力

中间表
中间表的产生:
1.view 视图
2.重新生成一个新表

Mysql服务器优化

myisam读锁定
1.

lock table t1 read
2.开启另一个mysql连接终端,接着去尝试:

select * from t1
3.再insert、update和delete t1这张表,你会发现所有的数据都停留在终端上没有真正的去操作

4.读锁定对我们在做备份大量数据时非常有用.

mysqldump -uroot -p123 test >test.sql
myisam写锁定
1.

lock table t1 write
2.打开另一个mysql终端,尝试去select、insert、update和delete这张表t1,你会发现都不能操作,都会停留在终端上,只有等第一个终端操作完毕,第二个终端才能真正执行.

3.可见表的写锁定比读锁定更严格

4.一般情况下我们很少去显式的去对表进行read 和write锁定的,myisam会自动进行锁定的.

Mysql服务器优化

二进制日志
1.log-bin=mysql-bin

查看bin-log日志:

mysql> show binary logs;
查看最后一个bin-log日志:

mysql> show master status;
慢查询日志
开户和设置慢查询时间:

vi /etc/my.cnf
log_slow_queries=slow.log
long_query_time=5
慢查询次数:

mysql> show global status like "%quer%"
socket问题
mysql socket无法登录

1. 有时登录mysql时提示不能用socket登录,此时可以换成tcp方式去登录,但是可以测试时可以这样用,但是必须要在php去用之前把这个事情解决了.

?


1

2

3

4

5

6


[[email protected] mysql]# mysql -uroot -pwei --protocol tcp -hlocalhost

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 34

Server version: 5.0.77-log Source distribution

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the buffer.

mysql>

这样就可以登录,这样就不用mysql.sock来登录,而mysql.sock是启动mysqld服务时产生的

root密码丢失

root密码丢失破解

?


1

2

3

4

5

6

7

8

9

10

11


1.service mysqld stop

2. mysqld_safe --skip-grant-tables --user=mysql &

//跳过授权表mysql.user和mysql.db这些表

3. mysql -uroot

4. set password=password("wei");

//用这一条语句结果报错,就是因为加了--skip-grant-tables

4. mysql>update user set password=password("wei") where user=‘root‘

and host=‘localhost‘;

5. mysql> set password for ro[email protected]=password("wei");

6. mysql> set password=password("wei");

//和第五步一样,都可能成功修改密码

时间: 2024-10-18 04:49:44

myusql 性能优化2的相关文章

iOS开发——项目实战总结&amp;UITableView性能优化与卡顿问题

UITableView性能优化与卡顿问题 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候,就会堆积很多cell.如果重用cell,为cell创建一个ID 每当需要显示cell 的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell 2.避免cell的重新布局 cell的布局填充等操作 比较耗时,一般创建时就布局好 如可以将cell单独放到一个自定义类,初始化时就布局好

Java性能优化之JVM GC(垃圾回收机制)

Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成.GC优化很多时候就是减少stop-the-world 的发生. JVM GC回收哪个区域内的垃圾? 需要注意的是,JV

Spark性能优化指南——高级篇

Spark性能优化指南--高级篇 [TOC] 前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题. 数据倾斜调优 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数据倾斜发生时的现象 绝大多数tas

Mysql数据库性能优化(一)

参考 http://www.jb51.net/article/82254.htm 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库. mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面

Android应用程序性能优化Tips

主要介绍一些小细节的优化技巧,虽然这些小技巧不能较大幅度的提升应用性能,但是恰当的运用这些小技巧并发生累积效应的时候,对于整个App的性能提升还是有不小作用的.通常来说,选择合适的算法与数据结构会是你首要考虑的因素,在这篇文章中不会涉及这方面的知识点.你应该使用这篇文章中的小技巧作为平时写代码的习惯,这样能够提升代码的效率. 通常来说,高效的代码需要满足下面两个原则: 不要做冗余的工作 尽量避免执行过多的内存分配操作 To ensure your app performs well across

使用Html5+C#+微信 开发移动端游戏详细教程:(六)游戏界面布局与性能优化

本篇教程我们主要讲解在游戏界面上的布局一般遵循哪些原则和一些性能优化的通用方法. 接着教程(五),我们通过Loading类一次性加载了全部图像素材,现在要把我们所用到的素材变成图片对象显示在界面上,由上而下,首先是top层,top里面包涵了玩家(微信)头像,关卡信息,怪物血条信息,玩家金币,玩家宝石,玩家总攻击力. 定义函数 setTop 来初始化top层: function setTop() { TopDiv = new LSprite();//定义top层 var Topshape = ne

电商邮件服务平台性能优化谈

从今年一月份开始,团队陆续完成了邮件服务的架构升级.新平台上线运行的过程中也发生了一系列的性能问题,即使很多看起来微不足道的点也会让整个系统运行得不是那么平稳,今天就将这段时间的问题以及解决方案统一整理下,希望能起到抛砖的作用,让读者在遇到类似问题的时候能多一个解决方案. 新平台上线后第一版架构如下: 这版架构上线后,我们遇到的第一个问题:数据库读写压力过大后影响整体服务稳定. 表现为: 1.数据库主库压力高,同时伴有大量的读,写操作. 2.远程服务接口性能不稳定,业务繁忙时数据库的插入操作延迟

web前端性能优化

前言:  在同样的网络环境下,两个同样能满足你的需求的网站,一个“Duang”的一下就加载出来了,一个纠结了半天才出来,你会选择哪个?研究表明:用户最满意的打开网页时间是2-5秒,如果等待超过10秒,99%的用户会关闭这个网页.也许这样讲,各位还不会有太多感触,接下来我列举一组数据:Google网站访问速度每慢400ms就导致用户搜索请 求下降0.59%;Amazon每增加100ms网站延迟将导致收入下降1%;雅虎如果有400ms延迟会导致流量下降5-9%.网站的加载速度严重影响了用户体验,也决

架构设计:系统存储(8)——MySQL数据库性能优化(4)

================================ (接上文<架构设计:系统存储(7)--MySQL数据库性能优化(3)>) 4-3.InnoDB中的锁 虽然锁机制是InnoDB引擎中为了保证事务性而自然存在的,在索引.表结构.配置参数一定的前提下,InnoDB引擎加锁过程是一样的,所以理论上来说也就不存在"锁机制能够提升性能"这样的说法.但如果技术人员不理解InnoDB中的锁机制或者混乱.错误的索引定义和同样混乱的SQL写操作语句共同作用,那么导致死锁出现的