- 浏览: 170544 次
- 性别:
- 来自: 南京
-
文章分类
- 全部博客 (133)
- 数据库 (17)
- Java基础 (18)
- Web (18)
- 工具应用 (4)
- 黑技术 (1)
- CRM (1)
- XMPP (1)
- openfire (7)
- 软件流程 (1)
- 高性能篇 (10)
- 网络通讯 (5)
- Http (1)
- 负载均衡 (4)
- linux (2)
- hadoop (3)
- 分布式 (6)
- SOA (2)
- 构建 (2)
- ant lvy (1)
- 同步异步IO/NIO (3)
- 事务相关 (7)
- mysql (6)
- 照相 (1)
- android (1)
- 高并发 (2)
- 搜索 (0)
- JVM (1)
- Spark (1)
- 架构师 (3)
- docker (3)
- 大数据 (1)
最新评论
-
yjsxxgm:
yjsxxgm 写道yjsxxgm 写道
揭秘淘宝286亿海量图片存储与处理架构 -
yjsxxgm:
yjsxxgm 写道
揭秘淘宝286亿海量图片存储与处理架构 -
yjsxxgm:
yjsxxgm 写道
揭秘淘宝286亿海量图片存储与处理架构 -
yjsxxgm:
揭秘淘宝286亿海量图片存储与处理架构 -
raodun:
哥们,nginx做websphere的会话保持何如写?
nginx的会话保持
1.MySQL 基础知识
1.1 安装包的选择
1.1.1 二进制包安装 vs. 源代码编译安装
如没有特殊定制的需求,没必要用源代码编译安装。
比如你想 MySQL 被安装在一个目录。
1.1.2. 官方二进制安装包 vs. 发行版二进制包
官方的二进制包的文件布局更接近从源代码安装的。各个发行版的二进制包安装后其文件布局可能会很不一样。
如果要使用官方二进制包安装,推荐使用 tarball 格式的,因为它安装后的文件结构最接近最常见的结构。
1.2. 配置文件
1.2.1. 文件位置
在类 unix 操作系统下,搜索顺序为:
/etc/my.cnf
datadir/my.cnf
~/.my.cnf
在 windows 下,顺序为:
%SystemRoot/my.ini
c:\my.cnf
1.2.2. 和配置文件相关的启动参数
--no-defaults 不使用任何配置文件
--defaults-file=/path/to/file 指定配置文件的路径
--defaults-extra-file=/path/to/file 在读取 my.cnf 文件后额外读取的配置文件
1.2.3. 几个示例文件的用处
my-small.cnf
my-medium.cnf
内存为 32M 到 64M 的 MySQL 专用的服务器
内存最多为 128M 的共享服务器(跑着 MySQL 、 Apache 等服务)。
my-large.cnf
my-huge.cnf
1.3.show 命令
1.3.1.show variables
显示运行变量
1.3.2.show status
显示状态
1.3.3.show innodb status
显示 innodb 的状态
2. 存储引擎
2.1.MySQL 架构
2.2. 锁和并发
2.2.1. 读 / 写锁
解决多并发读写的这一经典问题的方法是实现一个包含读锁和写锁的锁系统。
在资源上的读锁是共享的,多个客户端可以同时读一个资源。
写锁是独占的。当资源上有写锁的时候,任何其它的读和写都是不允许的。
2.2.2. 锁粒度
多数商业数据库使用行锁定。
2.2.2.1. 表锁定
因为 MyISAM 设计时假想的情况是 90% 的请求是读,所以 MyISAM 的表锁定在这种情况下也能获得很好的性能。
换句话说,对于读大量多于写的应用,适合选用 MyISAM 。
2.2.2.2. 页锁定
页锁定的开销比表锁定大。
页锁定中影响并发性的因素是页的大小。
BDB ( Berkeley DB )使用页锁定,页大小是 8KB 。
2.2.2.3. 行锁定
行锁定提供最大的并行性,当然也需要最大的额外开销。
InnoDB 使用的是行锁定,但不是简单的行锁定,它使用的是和 multiversioning schema 接合的行锁定。
2.2.3Multi-Version 并行控制
Multi-Version Concurrency Control ( MVCC )这种并行措施被 Oracle 、 PostgreSQL 和 MySQL 的 Innodb 存储引擎。
MVCC 是行锁定的另一种手段。它允许不上锁的读同时锁定必要的记录以便来写。
MVCC 中,所有查询面对的实际上是一个数据的快照。每行又 2 个额外的隐藏属性。它表示了这行创建和删除的”时间“。这里存储的不是真实的时间,而是一个由数据库系统维护的版本号。每执行一次查询(如果支持事务,则不是查询而是事务),这个版本号就增加一次。
在 MCVV 的机制下, DBMS 的主要任务就是跟踪所有正在运行的查询以及它们的版本号。
SELECT
当记录被 select 时, DBMS 必须检查此行是否符合以下规则:
-
创建版本号必须小于系统当前的版本号。这一点保证了此行是在当前查询开始之前创建的。
-
删除版本号(如果不为空)必须比系统当前版本号大。这保证了此行在的当前查询开始之前没有被删除。
-
创建版本号不能在正在正在运行的所有查询中。这保证了行不是被正在运行的查询添加或改变。
-
所有符合以上标准的行可以被返回为 select 的结果。
INSERT
当行被添加时, DBMS 同时将当前版本号作为行的创建版本号一并插入。
DELETE
DBMS 把当前版本号写入记录的删除版本号
UPDATE
写入一个新的原行的副本,将当前版本号作为创建版本号,将记录的删除版本号作为副本的删除版本号。
这样,读操作就不需要锁表。但附加信息增加了存储空间, DBMS 维护版本号又增加了系统开销。
MySQL 的锁模型和并行行
锁策略 |
并行性 |
额外开销 |
引擎 |
表锁定 |
最低 |
最低 |
MyISAM 、 HEAP 、 Merge |
页锁定 |
中等 |
中等 |
BDB |
MVCC |
最高 |
最高 |
InnoDB |
2.3. 事务
2.4. 选择正确的引擎
2.4.1. 考虑因素
2.4.1.1. 事务和并发性
如果应用需要事务和高读 / 写并发, InnoDB 是你的最佳选择。
如果应用需要事务但不要求高读 / 写并发, InnoDB 和 BDB 都是不错的选择。
如果应用不需要事务且查询中读大量大于写或者写大量大于读,则 MyISAM 是比较好的选择。很多 web 应用属于这种情况。
2.4.1.2. 备份
如果服务器能定期停机做备份,存储引擎比较好选择。如果需要联机备份,则比较麻烦。
混合的存储引擎架构备份比较麻烦,考虑到复杂度,应尽量选择一致的存储引擎。
2.4.1.3. 特殊功能
SELECT COUNT(*) FROM mytable
如果应用中对 count 函数有性能要求, MyISAM 比 InnoDB 要好。 MyISAM 能时刻知道总的行数,但 InnoDB 需要每次都重新计算。
如果应用需要定义实体完整性,则需要 InnoDB 。
如果应用需要全文搜索,则 MyISAM 。
如果发现需要的功能不能由一个存储引擎满足时,可能需要将一个表分割成多个表。
2.5. 存储引擎
属性 |
MyISAM |
Heap |
BDB |
InnoDB |
事务 |
No |
No |
Yes |
Yes |
锁粒度 |
Table |
Table |
Page(8KB) |
Row |
存储 |
Split files |
In-memory |
Single file per table |
Tablespace |
隔离级别 |
None |
None |
Read committed |
All |
可移植格式 |
Yes |
N/A |
No |
Yes |
参照完整性 |
No |
No |
No |
Yes |
有数据的主键 |
No |
No |
Yes |
Yes |
MySQL 缓存记录 |
No |
Yes |
Yes |
Yes |
可用性 |
All versions |
All versions |
MySQL-Max |
All versions |
表的定义存储在 .frm 文件中。
Show table status 命令显示表的属性。
例: SHOW TABLE STATUS LIKE 'user'
查看 user 表的属性。
2.5.1.MyISAM
ISAM= Index Sequential Access Method
2.5.1.1. 存储
有 2 种文件:数据文件( .MYD )和索引文件( .MYI )。
MyISAM 的文件可以自由复制。
MyISAM 的最大文件尺寸取决于文件系统,但是出于性能考虑, MyISAM 默认只操作 4GB 的数据。 MyISAM 的索引使用 32 位的指针。如果要使用操作 4GB 的数据,需要设置 MAX_ROWS 和 AVG_ROW_LENGTH 。
比如:
此表能存储 32GB 。
CREATE TABLE mytable ( a INTEGER NOT NULL PRIMARY KEY,
b CHAR(18) NOT NULL
) MAX_ROWS = 1000000000 AVG_ROW_LENGTH = 32;
2.5.1.2. 其它事宜
锁与并行
MyISAM 使用共享的读锁和独占的写锁
自动恢复
启动 MySQL 时使用— myisam-recover 选项可启动对 MyISAM 表的进行修复
手动修复
用命令 CHECK TABLE mytable 和 REPAIR TABLE mytable 检查和修复表。
或者使用命令行 myisamchk 在服务器离线的时候检查。
索引
MyISAM 可对 BLOB 和 TEXT 类型进行索引。
延后的键写入( Delayed key writes )
有 DELAY_KEY_WRITE 属性的表。对于索引的写入,并不是马上写入磁盘,而是先写入内存缓存,当此内容从缓存中除去或者表被关闭的时候,键内容才被写入磁盘。这对负载很重且经常被修改的表有很好的性能提升。
2.5.2. 压缩的 MyISAM 表
如果要把数据库放到光盘或者嵌入式系统中,且数据库不会被修改,可以用使用 myisampack 工具将 MyISAM 表压缩,以节约磁盘空间。解压缩所带来的额外开销不会很大,可以接受。
2.5.3.RAID MyISAM 表
要使用 raid 表,需要自己编译 mysql 以便使用 MySQL-Max 包。 raid 表是把数据文件分割,而不一定是要放到不同的磁盘上。
2 种使用 raid 表的目的: 1 、突破文件系统的单个文件尺寸限制 2 、将分开的数据文件放到不同的物理磁盘上以提高性能
下面是创建 raid 表的命令:
CREATE TABLE mytable ( a INTEGER NOT NULL PRIMARY KEY,
b CHAR(18) NOT NULL
) RAID_TYPE = STRIPED RAID_CHUNKS = 4 RAID_CHUNKSIZE = 16;
raid_type 表示 raid 的类型,可以是 striped 或者 raid0 。 raid_chunks 表示要将数据文件分割成几个。 raid_chunksize 表示向一个分割文件中写入多少个 KB 后再移动到下一个分割文件。
上面的例子中, MySQL 将创建 4 个子目录: 00,01,02,03 。每个子目录中存储一个文件 mytable.MYD 。
注意:如果系统中有 RAID 控制器并有软 RAID , raid 表就不是太需要了。另外需要注意的是,仅仅是将数据文件分块,而不是索引文件。如果你是为了解决文件系统的尺寸限制,还需要注意索引文件。
2.5.4.MyISAM Merge 表
Merge 表是 MyISAM 最新的功能。 raid 表是将文件分割,而 merge 表是将多个相似的表合并成一个虚表。
这对用 MySQL 来存储日志文件非常有用。每个表存储一段时间的记录,整体分析的时候把表 merge 成一个虚拟表。
用于 merge 的子表要符合以下条件:
完全一样的定义
是 MyISAM 表
在 MySQL4.1.1 后,支持不同数据库中表的 merge
如果要压缩 MyISAM 表,记得把它从 merge 中去掉,压缩后再加到 merge 里面去。
下面是创建 merge 的示例:
CREATE TABLE mytable0 ( a INTEGER NOT NULL PRIMARY KEY,
b CHAR(18) NOT NULL
);
CREATE TABLE mytable1 (
a INTEGER NOT NULL PRIMARY KEY,
b CHAR(18) NOT NULL
);
CREATE TABLE mytable2 (
a INTEGER NOT NULL PRIMARY KEY,
b CHAR(18) NOT NULL
);
CREATE TABLE mytable (
a INTEGER NOT NULL PRIMARY KEY,
b CHAR(18) NOT NULL
) TYPE = MERGE UNION = (mytable0, mytable1, mytable2) INSERT_METHOD = LAST;
INSERT_METHOD 告诉 MySQL 怎样处理对 merge 表的插入操作,其值可以为 NO 、 FIRST 和 LAST 。 NO 表示不允许插入。
3. 基准测试
3.1. 基准测试的重要性
3.2. 基准测试的策略
每次只改变一样东西
迭代测试
重复测试
使用真实数据
不要使用太多的客户端(除非是在进行压力测试,不然不要使用超过 50 个并发客户端)
不要在服务器上运行测试客户端
3.3
MySQL 基准测试的工具
MySQL Benchmark Suit
MySQL super-smack 一个压力测试工具
MyBench 一个用 perl 写的压力测试工具,比 super-smack 更容易扩展和定制
4. 索引
4.1. 基础
4.1.1. 基本概念
索引会增加 insert update delete 的开销,但会提高 select 的速度。
4.1.1.1. 部分索引
对整个字段进行索引
ALTER TABLE mytable1 ADD INDEX (name);
对字段的前 4 个字节索引
ALTER TABLE mytable ADD INDEX(name(4));
4.1.1.2. 多栏索引
对于查询: select * from mytable1 where fname='smith' and lname='john'
理论上创建 2 个查询: ALTER TABLE mytable1 ADD INDEX (fname,lname)
用户可以这样定义,但 MySQL 不会同时使用 2 个查询。实际上, MySQL 在每个表每个查询中只会使用一个索引(除了 union ) 。
MySQL 处理 union 是将 2 个表分别处理,然后再归并的。
4.1.1.3. 索引顺序
MySQL 没有提供手动指定索引顺序的方法。 MySQL 自己能优化索引。
4.1.1.4. 作为约束的索引
索引不是只能用于加快查询,还可以作为约束使用。 唯一索引( unique index )可以用来保证在某些列中某一值只会出现一次(除了 NULL ,这始终是特殊的情况)。
建立唯一索引:
ALTER TABLE mytable1 ADD UNIQUE(name);
因为是索引,所以也可以指定部分索引,
如:
ALTER TABLE mytable1 ADD UNIQUE(name(2));
这个语句规定 name 的前 2 个字母不能相同。
引申而言,对规定 unique 约束的字段查询可以提高速度。
如果唯一索引仅仅是起到唯一性约束而不提高查询性能的话,等于是浪费了空间,但目前 MySQL 没有这样的优化处理。
4.1.1.5.Clustered 和 secondary 索引
MyISAM 的索引存储在单独的文件里。这样保证了 MySQL 能快速地按照索引查询。
如果使用 clustered 索引,主键和记录是“捆绑”在一起的,并且是按照主键的顺序排列的。 InnoDB 用的是 clustered 索引。在 Oracle 中, clustered 索引被称为“ index-organized tables” ,这能帮助你理解主键和行顺序之间的关系。
如果你仅仅通过主键查找数据, clustered 索引将极大地提高性能。 标准的 MyISAM 索引在一次对索引列的查询中需要查找 2 次:先查找索引文件中的索引项,然后再去数据文件中查找。而 clustered 索引只需要查找一次。
当使用二级索引的时候, clustered 索引可能没那么快。
比如:
SELECT * FROM mytable1 WHERE phone='123';
主键是 name , phone 上也有索引,这时,使用的实际是 phone 的索引,而没有使用 name 索引。
但是在某些情况下,不当地使用 clustered 索引反而会降低性能。当同时使用 clustered 索引和二级索引时,需要特别考虑对存储的影响。二级索引指向的是主键而不是具体列。如果对很大的值做索引并且同时有很多二级索引,会造成有很多重复的主键的副本。当 clustered 索引的值很小的时候,这不会是问题,但当值很大时,这会造成很大存储问题。
也就是说,在 InnoDB , Oracle 中,不要对拥有很大值的字段做索引,即使有,也尽量不要使用二级索引。这会非常浪费存储空间。
在 clustered 索引中,对主键的修改的开销比较大。
在选择主键的时候尽量选择不会被修改,且数值小的字段。
4.1.1.6. 唯一索引( unique index ) VS 主键( primary key )
在 myISAM ,这 2 个基本没区别,唯一的区别是主键不能含有 NULL ,主键就是定义了 NOT NULL 的唯一索引。
InnoDB 和 BDB 中的每个表都需要主键。如果你不指定的话,它们会自己添加一个隐藏的主键,这个主键为一个自增的数字,和 AUTO-INCREMENT 字段相似。 Heap 引擎不需要主键,但它会自己建立一个。实际上,你可以创建没有任何索引的 heap 表。
4.1.1.7. 索引 NULL 值
在一般的数据库中, NULL 值可以存在有索引的字段内,但不能存在唯一索引中。但 MySQL 允许在唯一索引中存 NULL 。
4.2. 索引结构
4.2.1.B-Tree 索引
B-Tree 是最常见的索引结构。
基于范围的查询在 B-Tree 中速度很快,比如:
SELECT * FROM phone_book WHERE last_name BETWEEN 'Marten' and 'Mason'
此外还包括 min() max() 等函数 还有 如下范围查询:
SELECT COUNT(*) FROM phone_book WHERE last_name > 'Zawodny'
MySQL 只需要在 B-Tree 中找到 Zawodny 这个值,然后仅仅数这个节点的后继节点就可以了。
4.2.2.Hash 索引
hash 索引使用 hash 表来存储节点而不是一个平衡二叉树。
Hash 索引提供最快的 key 查找,但是灵活性相比其它的索引类型要弱一些。此时,基于范围的查询不能使用索引来提高速度。
Hash 索引对于文本( Text )和数值数据有比较好的效果,因为它能有效地减少索引的尺寸。
4.2.3.R-Tree 索引
R-Tree 索引用在空间或者 N 维数据上。这在地图和地理学应用上很有用。当然在基于坐标或者维的查询上很有用。
MySQL 的 R-Tree 实现是基于 OpenGIS 的规范,在 www.opengis.org 上可以找到。
空间数据索引对于大多数人可能比较陌生。
创建一个空间数据表:
mysql> create table map_test
-> (
-> name varchar(100) not null primary key,
-> loc geometry,
-> spatial index(loc)
-> );
4.3. 索引和表类型
4.3.1.MyISAM 表
MyISAM 默认的索引类型是 B-Tree 。 MyISAM 还提供了两种功能:前缀压缩( prefix compression )和 packed keys 。
前缀压缩( prefix compression )将提取出字符中公共前缀。比如一个字段存储了 URL ,显然存储重复的前缀“ http://” 回使 B-Tree 的每个节点大大增加。
Packed keys 是前缀压缩对于整数的的最好方法。数值的高位总是先被存储,对于大规模的数字 key ,最高位是很少变动的。
要启用 packed keys ,需要在 CREATE TABLE 里面设置 PACKED_KEY=1 。
4.3.1.1.Delayed key writes
有 DELAY_KEY_WRITE 属性的表。对于索引的写入,并不是马上写入磁盘,而是先写入内存缓存,当此内容从缓存中除去或者表被关闭的时候,键内容才被写入磁盘。这对负载很重且经常被修改的表有很好的性能提升。
4.3.2.Heap 表
将 B-Tree 和 Heap 表接合,速度将很完美。
4.3.3.BDB 表
MySQL 的 BDB 只提供 B-Tree 索引。
BDB 的索引和 MyISAM 一样提供前缀压缩。和 InnoDB 一样, BDB 也提供 clustered 索引。 BDB 需要主键,如果你没有指定,系统会创建一个隐藏的。这是因为 BDB 通过主键找到行。索引总是指向主键,而不是指向行的物理位置。这说明,按照二级索引查找比按照主键索引查找要慢 。
4.3.4.InnoDB 表
InnoDB 提供 B-Tree 索引。但没有提供前缀压缩和打包( packing )。 InnoDB 需要主键,如果你不指定,系统将自动指定一个 64 位的值。
索引文件存储在 InnoDB 的表空间里面。 InnoDB 使用 clustered 索引。即是说,主键的值直接影响行和索引节点的物理位置。所以, InnoDB 中基于主键的查询会非常快 。当记录被找到的时候,也同时被缓存了到缓冲池里面了。
4.3.5. 全文索引
MyISAM 支持全文索引。全文索引能在文本字段( VARCHAR TEXT 等)上做。全文索引是存储在 MYI 文件中。其具体实现是创建一个有 2 部分的 B-Tree 索引,第一部分是 varchar ,第二部分是 float 。 varchar 存储被索引的字符, float 存储在其在行中的权重。
全文索引会索引行中的每个单词,由于 MySQL 的 B-Tree 很高效,全文索引带来的性能提升绝对值得造成的存储开销。
比如:
select * from articles where body='%database%'
下面的语句会快很多很多。
select * from articles (body) march against ('database')
4.3.6. 索引限制
全文索引只是对单词(英文是单词,中文是单字)做索引。比如,搜索中间有“ or” 的单词,如 word,lord ,用全文索引是不行的。
4.3.6.2. 正则表达式
比如:
select last_name from phone_book where last_name rlike "(son|ith)$"
rlike 是 MySQL 中正则匹配的语句。
但这会很慢。
MySQL 的 SQL 优化器不会优化基于正则表达式的查询。
4.4. 索引维护
4.4.1. 获得索引信息
获得表的创建信息: SHOW CREATE TABLE mytable1;
获得表的索引信息: SHOW INDEXES FROM mytable1;
4.4.2. 刷新索引数据
整理碎片,优化查询 : OPTIMIZE TABLE mytable1;
MySQL 将重新创建索引。
当数据库下线时,可以使用命令行工具: myisamchk
InnoDB 和 BDB 不是很需要这样的操作。
5. 查询性能
5.1. 查询处理基础
5.1.1. 查询缓存
自 MySQL4.0.1 之后你可以在 my.cnf 中设置:
query_cache_type = 1
开启查询缓存
query_cache_type= 2
按需模式
MySQL 是将查询 hash 处理后再存到缓存中的。
基于这样原因, SELECT * FROM table1 和 select * from table1 是不同的缓存项。 MySQL 不会修饰开始和结尾的空格,所以对于的空格也会造成缓存项不同。
MySQL 只会对 SELECT 做缓存。它通过判断 SQL 语句的前 3 个字母是否为 sel 来判断是否为 select 查询。所以,对于这样的语句:
/* This is a select */ select * from mytable1
这个语句加上注释后,在执行的时候,可以通过 show processlist 命令来方便查看。
直到 MySQL5.0 ,都不能判断出是一个 select 查询,导致不能进行缓存。
有时候我们不希望使用缓存。可以在 sql 语句里面加入 SQL_NO_CACHE 就可以。如:
select sql_no_cache * from mytable1
这对防止缓存污染很有用。
另,有的查询不需要缓存(如,某查询一天只会执行一次),可以这样来禁止 MySQL 缓存它,以便为其它查询留空间。
当 my.cnf 中的 query_cache_type=2 时候,只有在 sql 中加入 SQL_CACHE 时才启用缓存。
如:
select sql_cache * from mytable1
5.1.2. 解析、分析 和 优化
5.1.3. 使用 EXPLAIN
首先我们可以用 DESC 命令查看表结构: desc mytable1;
我们可以在 sql 语句前加上 explain 来查看语句的执行情况,如:
explain select * from mytable1 where name='tml';
5.1.4. 执行
5.2. 优化器的特色和怪脾气
测试查询时,一定记得使用真实数据。
MySQL 会自己判断是否使用查询,当需要遍历用 where 表示的某个数量的数据时候, MySQL 会不使用索引。因为读取连续的数据比按索引一个一个读要快。
5.2.2. 基于索引的排序
MySQL 在一个表的一个查询上只会使用一个索引。
对于含有 order by 的查询,若没有使用到索引,可以给排序字段添加 b-tree 索引来提速。
对于已经有索引的情况,则将排序字段添加到已有索引中去。
如:
SELECT * FROM weather WHERE city = 'Toledo' ORDER BY the_date DESC
可以这样添加索引:
ALTER TABLE weather DROP INDEX city, ADD INDEX (city, the_date)
注意:上面删除了原有的 (city) 索引。
注意, alter 中字段的顺序很重要。根据最左前缀原则 (leftmost prefix rule) 。
我的理解,:索引的选择按照按照最左前缀。如,上面的查询,发现 city 时候,和索引 (city,the_date) 的最左前缀“ city” 匹配,则使用。又如, select * from where the_data='2008-01-01' 就不能使用 (city,the_city) 索引。
5.2.3. 无效查询
5.2.4. 用全文检索替代 LIKE
目前的 MySQL 的查询优化器对于全文检索的处理还不够聪明。当有一个可用的全文索引时,它会使用它,而不考虑索引能真正消除多少无关行。
5.3. 识别慢查询
要找到慢查询,可以启用慢查询日志( slow query log )。该日志记录的仅仅是耗时较长的查询,而不一定是效率低的。
造成查询有时缓慢的原因:
1 、表被锁了,日志中的 Lock_time 显示了查询等待锁释放的时间。
2 、数据或索引没有被缓存进内存。这在 MySQL 刚启动的时候比较常见。
3 、备份进程正在运行
4 、 CPU 负载很大
可以使用 mysql 自带的 perl 脚本 mysqldumpslow 去整理 slow log 。
5.4. 用 hint 影响 mysql
mysql 的 hint 一般出现在 select 语句的右边,如:
SELECT SQL_CACHE * FROM mytable;
当为多 dbms 写查询的时候,可以用注释语句来自动屏蔽掉 mysql 特有的语句,如:
SELECT /*! SQL_CACHE */ * FROM mytable;
5.4.1.join 的顺序
如果你觉得 mysql 对 join 的顺序处理不好,可以使用 STRAIGHT_JOIN 代替 JOIN 或者“ .” ,如:
SELECT * FROM table1 STRAIGHT_JOIN table2 ON .....;
这样就强迫 mysql 按照表在查询中出现的顺序来使用表。
5.4.2. 索引使用
在表名后面使用 USE INDEX( 索引列表 ) 让 mysql 使用查询,如:
SELECT * FROM mytable USE INDEX(mod_time,name) ...;
如果你想让 mysql 不使用查询,使用 IGNORE INDEX( 索引列表 ) ...
5.4.3. 结果大小
当结果很大的时候, SQL_BUFFER_RESULT 告诉 mysql 将结果存储到一个临时表里面去,这样能更快地释放锁。
SQL_BIG_RESULT 告诉 mysql 结果集将会很大,让 mysql 在做决定的时候会更多地考虑基于磁盘的临时表。这样也不大可能为了排序而在临时表上建立索引。
5.4.4. 查询缓存
SQL_CACHE 让 mysql 使用缓存。 SQL_NO_CACHE 让 mysql 不使用缓存。
如果在配置中将 query_cache_type 设置为 1, 就是主动模式,则所有没有指定 SQL_NO_CACHE 的查询都默认使用缓存。
如果将 query_cache_type 设置为 2 ,即是按需模式,只有使用了 SQL_CACHE 的查询才会使用缓存。
5.5. 愚蠢的查询策略
5.5.1. 两个比一个好
发表评论
-
mysql 临时表、内存表和视图
2017-03-02 14:41 4870虚拟表,顾名思义,就是实际上并不存在(物理上不存在),但是逻辑 ... -
Mysql几种索引类型的区别及适用情况
2017-02-28 15:40 678如大家所知道的,Mysql ... -
MySQL中的锁(表锁、行锁)
2017-02-24 19:18 735MySQL中的锁(表锁、行锁) 锁是 ... -
MySQL 中的数据类型介绍
2017-02-20 17:17 354<转自http://blog.csdn.net/an ... -
MySQL的btree索引和hash索引的区别
2016-08-29 10:48 575Hash 索引结构的特殊性,其检索效率非常高,索引的检索可 ...
相关推荐
High Performance Web Sites by Nate Koechley 123 One dozen rules for faster pages 123 Why talk about performance? 123 Case Studies 124 Conclusion 124 Rules for High Performance Web Sites 124...
15. **数据库支持**:sylar支持与MySQL、SQLite3数据库的交互,并且包含ORM(对象关系映射)功能,简化数据库操作。 16. **缓存支持**:集成了Redis数据库,用于高速缓存,提高数据读取速度。 17. **集群协调**:...
内容概要:本文详细介绍了基于西门子S7-200 PLC和组态王软件构建的八层电梯控制系统。首先阐述了系统的硬件配置,包括PLC的IO分配策略,如输入输出信号的具体分配及其重要性。接着深入探讨了梯形图编程逻辑,涵盖外呼信号处理、轿厢运动控制以及楼层判断等关键环节。随后讲解了组态王的画面设计,包括动画效果的实现方法,如楼层按钮绑定、轿厢移动动画和门开合效果等。最后分享了一些调试经验和注意事项,如模拟困人场景、防抖逻辑、接线艺术等。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是对PLC编程和组态软件有一定基础的人群。 使用场景及目标:适用于需要设计和实施小型电梯控制系统的工程项目。主要目标是帮助读者掌握PLC编程技巧、组态画面设计方法以及系统联调经验,从而提高项目的成功率。 其他说明:文中提供了详细的代码片段和调试技巧,有助于读者更好地理解和应用相关知识点。此外,还强调了安全性和可靠性方面的考量,如急停按钮的正确接入和硬件互锁设计等。
内容概要:本文深入探讨了无人驾驶车辆使用动力学MPC(模型预测控制)算法进行蛇形线路径跟踪的技术细节。首先介绍了蛇形线的特点及其对无人驾驶车辆带来的挑战,随后详细讲解了动力学MPC算法的基础理论,包括车辆状态表示、运动方程建模以及控制输入的选择。接着重点阐述了如何通过定义合适的目标函数并加入适当的约束条件来优化MPC算法,使其能够高效地完成蛇形线路径跟踪任务。此外,文中还讨论了一些常见的错误做法和技术改进措施,如引入航向角误差补偿项、采用松弛变量处理约束条件等。最后,作者分享了多个实用的小技巧,例如预测时域内的速度适配和平滑处理、适当降低控制频率以提高跟踪精度等。 适合人群:对无人驾驶技术和控制算法感兴趣的科研人员、工程师及高校学生。 使用场景及目标:适用于研究无人驾驶车辆路径规划与控制领域的项目开发,旨在帮助读者掌握动力学MPC算法的具体应用方法,从而更好地解决实际工程问题。 其他说明:文章不仅提供了详细的理论推导和代码实现,还结合具体案例进行了充分的实验验证,确保所提出的解决方案具有较高的可行性和可靠性。
内容概要:本文详细介绍了BYVIN(比德文)电动四轮车控制器的技术细节,涵盖了硬件设计和软件实现两大部分。硬件方面,提供了PCB文件和PDF原理图,展示了电路板布局、元件位置及电路连接关系。软件方面,代码结构清晰,模块化设计良好,包括初始化、速度数据处理、PWM配置、故障保护机制等功能模块。文中还提到了一些独特的设计细节,如PWM死区补偿、故障分级处理、卡尔曼滤波估算电池电量等。此外,代码仓库中还包括了详细的注释和调试技巧,如CAN总线实时数据传输、硬件级关断+软件状态机联动等。 适合人群:具备一定嵌入式开发基础的研发人员,尤其是对STM32F4系列单片机和电动车辆控制系统感兴趣的工程师。 使用场景及目标:适用于希望深入了解电动四轮车控制器设计原理和技术实现的研究人员和开发者。目标是掌握电动四轮车控制器的硬件设计方法和软件编程技巧,提升实际项目开发能力。 其他说明:本文不仅提供了代码和技术细节,还分享了许多实战经验和设计思路,有助于读者更好地理解和应用这些技术。
内容概要:本文详细介绍了基于S7 300 PLC和组态王的车门包边机控制系统的设计与实现。主要内容涵盖I/O分配、梯形图编程、接线图设计以及组态王的画面构建。文中通过具体的实例展示了如何利用PLC实现车门包边机的精确控制,包括启动逻辑、电机与气缸控制逻辑等。此外,还讨论了接线图中的防干扰措施、梯形图中的特殊逻辑设计以及组态王中的动态效果实现方法。最终,通过合理的硬件配置和软件编程,实现了高效、稳定且直观的车门包边机控制系统。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和组态软件使用的专业人士。 使用场景及目标:适用于汽车制造生产线中的车门包边机控制系统的开发与维护。目标是提高生产设备的自动化水平,增强系统的稳定性和可靠性,减少人工干预,提升生产效率。 其他说明:本文不仅提供了详细的理论讲解,还包括了许多实际操作中的经验和技巧,有助于读者更好地理解和应用相关技术。
基于C#实现的照片自动分拣程序+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 简单易用的照片自动分类工具,它能够自动读取照片的拍摄日期信息,并按照年月结构将照片整理到对应的文件夹中,帮助用户轻松管理大量照片文件。 主要功能 自动分类:根据照片的拍摄时间,自动将照片分类到对应的年月文件夹中 多格式支持:支持 JPG、JPEG、PNG、GIF 等常见图片格式 智能处理: 自动读取照片 EXIF 信息获取拍摄日期 当无法读取 EXIF 信息时,自动使用文件创建时间 智能处理文件重名冲突 高效处理: 采用并行处理技术,提高大量照片的处理速度 优化文件读取和移动操作,减少系统资源占用 自动调整并行任务数量,平衡系统负载
KUKA机器人相关文档
Tripple Farm:Match 3 Combination Game Complete Project 合成小镇三消Unity合成消除游戏项目游戏插件模版C# 支持Unity2020.3.4或更高 您知道像三合镇这样的著名益智游戏,并且您想制作一个自己的游戏。就是这样。这个包正好适合您。 这是一个完整的项目,您可以在零分钟内将其上传到 appstore 或 googleplay 商店。 基本规则: 3个或以上相同的道具可以匹配升级为新的道具。动物如果被困住,也可以合并。 羽毛: -移动(android/ios)就绪。 - 包含所有源代码。 -超过 12 座建筑/军团需要升级。 -三种特殊物品可以提供帮助。 - 三个不同的主题(场景和动物) -unity iap 支持 -Unity UI -广告位已准备好 -包含详细文档
内容概要:本文详细介绍了基于下垂控制的三相逆变器电压电流双闭环控制的仿真方法及其在MATLAB/Simulink和PLECS中的具体实现。首先解释了下垂控制的基本原理,即有功调频和无功调压,并给出了相应的数学表达式。随后讨论了电压环和电流环的设计与参数整定,强调了两者带宽的差异以及PI控制器的参数选择。文中还提到了一些常见的调试技巧,如锁相环的响应速度、LC滤波器的谐振点处理、死区时间设置等。此外,作者分享了一些实用的经验,如避免过度滤波、合理设置采样周期和下垂系数等。最后,通过突加负载测试展示了系统的动态响应性能。 适合人群:从事电力电子、微电网研究的技术人员,尤其是有一定MATLAB/Simulink和PLECS使用经验的研发人员。 使用场景及目标:适用于希望深入了解三相逆变器下垂控制机制的研究人员和技术人员,旨在帮助他们掌握电压电流双闭环控制的具体实现方法,提高仿真的准确性和效率。 其他说明:本文不仅提供了详细的理论讲解,还结合了大量的实战经验和调试技巧,有助于读者更好地理解和应用相关技术。
内容概要:本文详细记录了作者对EP100伺服驱动器进行的一系列优化和改进。主要内容包括:修复原厂代码中的多个致命Bug,如定时器配置冲突、PWM信号不触发、电流采样误差等问题;优化电机启动、增量编码器找零、串口通信、相序反转等功能;并对硬件进行了改进,如调整MOS管布局、优化滤波电容位置等。通过这些改动,显著提高了系统的稳定性、精度和可靠性。 适合人群:具有一定嵌入式系统开发经验的工程师,尤其是熟悉STM32单片机和伺服控制系统的技术人员。 使用场景及目标:适用于需要对现有伺服驱动器进行性能优化和技术改造的项目。主要目标是提高系统的稳定性和精度,解决原厂代码中存在的各种问题,确保伺服驱动器能够在高负载条件下正常工作。 其他说明:文中提供了详细的代码片段和硬件改进措施,帮助读者更好地理解和应用相关技术。同时,作者分享了许多实际操作中的经验和技巧,对于从事类似项目的工程师具有很高的参考价值。
内容概要:本文详细介绍了光储直流微电网中利用Simulink进行仿真建模的方法,重点探讨了光伏系统的最大功率点跟踪(MPPT)控制以及蓄电池和超级电容的功率分配策略。文中提供了具体的MATLAB代码实现,包括MPPT控制算法和低通滤波器(LPF)用于功率分配的具体参数设置。此外,还讨论了仿真过程中遇到的问题及解决方案,如避免系统震荡、优化直流母线电压控制等。 适合人群:从事电力电子、新能源发电、微电网研究的技术人员和研究人员,尤其适用于有一定Simulink使用经验和MATLAB编程基础的人群。 使用场景及目标:①理解和掌握光储直流微电网的工作原理;②学习如何使用Simulink搭建完整的光储并网系统仿真模型;③优化MPPT控制算法和功率分配策略,提高系统的稳定性和效率。 其他说明:文章强调了参数整定的重要性,并分享了许多实用的经验和技术细节,对于希望深入研究光储直流微电网仿真的读者非常有价值。
stm32 PWM学习专题附代码
2898702486frft2d.m
包括:源程序工程文件、Proteus仿真工程文件、配套技术手册等 1、采用51/52单片机作为主控芯片; 2、采用汇编语言编程; 3、采用8个DS18B20传感器检测8路温度; 4、采用数码管循环显示通道号及温度值; 5、采用74HC595驱动显示;
内容概要:本文详细介绍了如何使用MATLAB GUI构建一个功能丰富的图像处理工具箱。该工具箱涵盖了图像的基本操作如灰度化、边缘检测、直方图均衡化等功能,并提供了实时对比和多种算法选择。文中不仅展示了具体的代码实现,还深入探讨了每种算法背后的原理和技术细节。例如,灰度化采用NTSC标准权重进行RGB到灰度的转换,边缘检测使用Sobel和Canny算子,直方图均衡化则强调了在HSV空间处理V通道的重要性。此外,作者分享了许多实践经验,包括性能优化技巧、异常处理以及不同算法在特定场景下的表现。 适合人群:具有一定MATLAB基础的开发者、图像处理领域的研究人员及爱好者。 使用场景及目标:① 学习MATLAB GUI编程及其在图像处理中的应用;② 掌握常见的图像处理算法及其优化方法;③ 构建自己的图像处理工具箱,用于科研或工程项目。 其他说明:文章配有详细的代码示例和理论解释,有助于读者更好地理解和掌握相关知识点。同时,文中提到的一些优化技巧和注意事项对于提高程序性能和稳定性非常有用。
内容概要:本文详细介绍了如何使用Simulink搭建BLDC无刷直流电机的转速电流双闭环控制系统。首先,文章解释了电流环和转速环的设计要点,包括PI控制器参数的选择、电流采样的频率设置以及PWM生成模块的配置。接着,作者分享了一些实用的仿真技巧,如使用简化版卡尔曼滤波代替传统测速发电机、加入PWM载波频率的随机抖动以减少谐振噪声、以及针对常见错误的解决方案。此外,文中还提供了具体的MATLAB代码片段,帮助读者更好地理解和实现各个模块的功能。最后,文章强调了仿真过程中需要注意的关键点,如参数整定、故障注入模块的应用和仿真加速方法。 适合人群:从事电机控制研究的技术人员、电气工程专业的学生以及对BLDC电机仿真感兴趣的工程师。 使用场景及目标:适用于需要进行BLDC电机控制算法开发和测试的研究项目,旨在提高仿真效率并确保最终控制效果的稳定性。通过学习本文,读者能够掌握双闭环控制系统的搭建方法及其优化技巧。 其他说明:文中提供的代码和技巧均经过实际验证,具有较高的实用性。建议读者在实践中结合自身需求进行适当调整。
内容概要:本文详细介绍了微电网并离网下垂控制Simulink模型的设计与实现,特别针对MATLAB 2018版本。模型涵盖分布式电源、负荷、储能装置及控制模块,通过下垂控制实现微电网在并网和离网模式间的平稳切换与稳定运行。文中提供了详细的代码示例,解释了下垂控制的关键参数设定及其对系统稳定性的影响。此外,还讨论了并离网切换逻辑、锁相环设计、滤波器参数选择等问题,并给出了仿真技巧和性能评估方法。 适合人群:从事电力系统研究、微电网控制技术研发的专业人士和技术爱好者。 使用场景及目标:①研究微电网并离网控制策略;②验证下垂控制算法的有效性;③优化微电网系统的动态响应和稳定性;④测试不同工况下的系统性能。 其他说明:该模型在MATLAB 2018中表现出色,能够作为可靠的研究工具,帮助研究人员深入了解并离网下垂控制的原理与应用。
内容概要:本文详细介绍了FPGA处理周期信号的两种主要方法:状态机和计数器。首先,通过对两个具体版本的Verilog代码进行解析,展示了不同的处理逻辑和技术细节。版本一采用简单的移位操作,适用于信号放大的场景;版本二引入计数器,能够实现周期信号的累加,适用于统计数据的应用。接着,文章深入探讨了状态机和计数器两种实现方式的特点与优劣。状态机版本虽然调试友好,但在高频信号处理时可能存在时序问题;计数器版本资源占用少,适合高频或占空比不固定的场景。此外,还提供了具体的性能实测对比,如资源占用、最大频率和抗干扰能力等方面的数据。最后,给出了实际项目的选型建议,强调了根据具体需求选择合适的实现方案的重要性。 适合人群:具有一定FPGA开发经验的研发人员,尤其是从事数字电路设计、嵌入式系统开发的技术人员。 使用场景及目标:①帮助开发者理解FPGA处理周期信号的基本原理;②提供两种常见实现方案的具体代码示例及解析;③指导开发者根据实际项目需求选择最合适的实现方式。 其他说明:文中不仅提供了理论分析,还结合了实际案例,分享了作者在调试过程中遇到的问题及解决方案,有助于读者更好地理解和应用相关技术。
内容概要:本文详细介绍了电力市场节点出清电价(LMP)的概念及其计算方法,特别关注了节点边际电价的形成机制。作者通过Python代码实现了多个简化模型,展示了不同约束条件下(如线路容量、爬坡率等)对电价的影响。首先,文章通过一个三节点系统的例子,讲解了如何利用线性规划工具linprog进行出清计算,并探讨了线路阻塞对电价的影响。接着,进一步讨论了机组运行约束(如爬坡率、启停成本等)对LMP的具体影响。此外,还提到了一些实际工程中的特殊情况,如网络损耗和逆向调度效应。最后,给出了几个实操建议,帮助初学者更好地理解和应用这些概念。 适合人群:对电力市场感兴趣的初学者,尤其是希望深入了解节点电价计算原理的技术人员。 使用场景及目标:适用于想要通过编程方式理解电力市场运作机制的学习者;目标是让读者能够独立构建并分析简单的电力市场出清模型,从而掌握LMP的基本概念和应用场景。 其他说明:文中提供了详细的代码示例,便于读者跟随练习。同时强调了理解LMP对于电力市场参与者的重要性,以及它在资源配置中的作用。