Mysql DOC阅读笔记
Mysql DOC阅读笔记
Speed of SELECT Statements
- 合理利用索引
- 隔离调试查询中花费高的部分,例如函数调用是在结果集中的行执行还是全表中的行执行
- 最小化全表扫描的数量,特别是在大表中
- 定期使用
ANALYZE TABLE语句更新表的统计数据,使查询优化器可以做出更合理的优化。 - 学习各个
存储引擎的特殊调试,索引和配置 - 优化单条只读查询事务
- 避免使用难以理解的方式编写QUERY,因为查询优化器可能使用的还是同样的优化决策,不要牺牲SQL的可读性
- 如果性能问题不能通过基本的
GUIDELINES解决,那么使用EXPLAIN语句查看更具体的信息 - 调整MySQL所使用到的用作缓存的内存区域,例如(InnoDB buffer pool, MyISAM key cache, MySQL query cache)
- 小心处理锁的问题
EXPLAIN Statement
结果字段
id: SELECT的标识符select_type: SELECT的类型SIMPLE: Simple SELECT (not using UNION or subqueries)PRIMARY: Outermost SELECTUNION: Second or later SELECT statement in a UNIONDEPENDENT UNION: Second or later SELECT statement in a UNION, dependent on outer queryUNION RESULTRESULT of a UNIONSUBQUERYFirst SELECT in subqueryDEPENDENT SUBQUERYFirst SELECT in subquery, dependent on outer query.DERIVEDDerived table SELECT (subquery in FROM clause)MATERIALIZEDMaterialized subqueryUNCACHEABLE SUBQUERYA subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query
table: The name of the table to which the row of output refers- <unionM,N> M,N为子查询的id
- <deriveN> N为子查询的id
- <subqueryN> N为子查询的id
partitions: 使用的分区type: JOIN TYPEpossible_keys: 可选的索引key: 查询用到的key或者indexkey_len: The key_len column indicates the length of the key that MySQL decided to use. The length is NULL if the key column says NULL. Note that the value of key_len enables you to determine how many parts of a multiple-part key MySQL actually usesref: The ref column shows which columns or constants are compared to the index named in the key column to select rows from the table.rows: The rows column indicates the number of rows MySQL believes it must examine to execute the queryfiltered: The filtered column indicates an estimated percentage of table rows that will be filtered by the table condition. That is, rows shows the estimated number of rows examined and rows × filtered / 100 shows the number of rows that will be joined with previous tables.Extra: This column contains additional information about how MySQL resolves the query. See Explain Extra Information
MySQL Index
- 多列索引,查询条件需要按照列的顺序并且起始列为索引的起始列,中间不能有间隔
使用MIN()或者MAX()查询的时候多列索引的使用也遵循最左列的原则,即WHERE中要先使用多列索引中的最左列,那么查询优化器会将MIN()和MAX()做一个key上的扫描,然后将常数的结果进行替换。例如:
SELECT MIN(key_part2),MAX(key_part2) FROM tbl_name WHERE key_part1=10;LIKE也能使用索引,只要参数是常量,并且不以通配符开头- 在不通列的对比中如果要使用索引,需要两个列的数据类型一样,CHAR(10)和VARCHAR(10)被认为是一样的。
- 多列索引的实现: A multiple-column index can be considered a sorted array, the rows of which contain values that are created by concatenating the values of the indexed columns.
- 多列索引详情见Multiple Index
- Mysql对Where的优化详情见Where Optimization
- InnoDB的聚簇索引含有列数据,优先建立组合索引而不是每一列的单独索引。InnoDB的二级索引的叶子节点中存储的是PK,而不是行号。MyISAM的索引是非聚簇索引,叶子节点中是行指针。See more
- 在where条件中查询条件对索引使用的影响:
Any index that does not span all AND levels in the WHERE clause is not used to optimize the query. In other words, to be able to use an index, a prefix of the index must be used in every AND group. The following WHERE clauses use indexes:
... WHERE index_part1=1 AND index_part2=2 AND other_column=3 /* index = 1 OR index = 2 */
... WHERE index=1 OR A=10 AND index=2 /* optimized like "index_part1='hello'" */
... WHERE index_part1='hello' AND index_part3=5 /* Can use index on index1 but not on index2 or index3 */
... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3; These WHERE clauses do not use indexes: /* index_part1 is not used */
... WHERE index_part2=1 AND index_part3=2 /* Index is not used in both parts of the WHERE clause */
... WHERE index=1 OR A=10 /* No index spans all rows */
... WHERE index_part1=1 OR index_part2=10
buffer pool
buffer pool 是Mysql中用来存放InnoDB的表和索引数据的内存区域, 这些内存区域被划分成页。buffer pool使用使用linked list作为pages的实现。页的交换使用LRU算法,在大内存的系统中,你可以将buffer pool划分成多个buffer pool instances。 innodb_buffer_pool_size中配置的内存大小被所有buffer pool实例所分割,多buffer pool实例更适给Innodb buffer pool划分几个G以上空间的应用,每一个实例都可以得到一个1G或者以上大小的空间。
Read-Only Transactions
如果InnoDB可以提前知道一个事务是只读事务,那么它就可以避免使用transaction ID(TRX_ID)。Transaction ID只需要在语句存在更新或者读语句中存在锁的情况中使用。 InnoDB是这样检测只读事务的:
- 事务以START TRANSACTION READ ONLY语句开始,但是这种情况仍可以对session-specific临时表进行更新,因为对这些表进行更新不影响其他事务。
- autocommit标志位打开的情况下,所有事务都是一条但语句,那么没有更新的语句将会被包装成只读事务。
- 事务没有用READ ONLY选项,但是还没有更新语句或者明确的锁语句,这时候事务是一个只读事务,知道遇到了一个明确的锁或者更新语句。 所以,对于查询语句可以将它们放在一个READ ONLY事务中,或者在执行select语句之前打开autocommit选项,或者只是简单的不要吧DML放在DQL中间。
Other
innodb行锁的实现方式
对于innodb的表而言,insert、update、delete等操作虽然都是加行级锁,但这些行锁都是通过给索引上的索引项加锁来实现的,这就意味着:只有通过索引条件检索数据,innodb才能使用行级锁,否则,innodb将使用表级锁。 * 在不通过索引条件检索的时候,innodb使用的是表锁,不是行锁。 例如:
create table tab_no_index(id int,name varchar(10)) engion=innodb; create table tab_with_index(id int,name varchar(10),key id_idx(id)) engion=innodb; 语句select * from tab_no_index where id=1 for update;会加表锁,而select * from tab_with_index where id=1 for update;会加行锁。
虽然访问不同行的记录,但是如果是使用相同的索引键,仍然会出现锁冲突。 例如,上例表tab_with_index中有两条记录为(1,’1’)和(1,’4’),则select * from tab_with_index where id=1 and name=’1’ for update;会对这两条记录都加锁。
当表有多个索引时,不同的事务可以使用不同的索引锁定不同的行。此外,不论是使用主键索引、唯一索引或普通索引,innodb都会使用行锁对数据加锁。
innodb的间隙锁(Next-key锁)
当使用范围条件而不是相等条件检索数据,并请求共享或排他锁时,innodb会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不 存在的记录,叫做“间隙”,innodb也会对这个“间隙”加锁。例如,emp表中只有101条记录,其中empid为索引键,值分别为 1,2,……,100,101,语句select * from emp where empid>100 for update;不仅会对101记录加锁,还会对empid大于101(这些记录不存在)的“间隙”加锁。
Mysql DOC阅读笔记的更多相关文章
- 《高性能MySql》阅读笔记
1.查询优化,索引优化和架构优化三者相辅相成.(数据库架构是获得高性能的必要条件,但如果查询设计得不好,即便是最好的架构页无法获得高性能.) 2.查询性能低下的最基本的原因就是访问了太多的数据. 3. ...
- Mongodb Manual阅读笔记:CH6 聚合
6 聚合 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...
- Mongodb Manual阅读笔记:CH4 管理
4 管理 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...
- mysql颠覆实战笔记(一)--设计一个项目需求,灌入一万数据先
版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...
- 《Thinking In Java》阅读笔记
<Thinking In Java>阅读笔记 前四章:对象导论. 一切都是对象. 操作符. 控制执行流程 public在一个文件中只能有一个,可以是一个类class或者一个接口interf ...
- gogs 源码阅读笔记 001
gogs 源码阅读笔记 001 gogs项目相当不错,本笔记实际是基于gogs fork版本 git-122a66f. gitea (gitea版本由来)[https://blog.gitea.io/ ...
- 《modern-php》 - 阅读笔记 - 最佳实践
过滤.验证和转义数据 过滤数据 不要相信任何外部数据! 常见的有以下几种数据需要过滤:HTML,SQL查询,用户提交的信息(邮件地址.电话号码.身份证) HTML htmlentities() HTM ...
- Head First HTML与CSS阅读笔记(二)
上一篇Head First HTML与CSS阅读笔记(一)中总结了<Head First HTML与CSS>前9章的知识点,本篇则会将剩下的10~15章内容进行总结,具体如下所示. div ...
- 阅读笔记 1 火球 UML大战需求分析
伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本 <火球 UML大战需求分析>,首先 ...
随机推荐
- 转储指定的数据块并查看TRC信息
1.转储指定的块:需要两个信息:文件号和块号 BYS@bys1>alter system dump datafile 1 block 100; System altered. 2.定位找出use ...
- java简单实现季节,性别分词处理
淘宝里面,每个宝贝都有一个标题,根据标题来分词,区分出季节和性别,分别写了两个方法,供大家参考. public int season(String str) { String dest = " ...
- cocos2d-x 2.0 拖尾效果分析
转自:http://game.dapps.net/gamedev/game-engine/7281.html 在Cocos2d-x中,拖尾效果有一个专门的类CCMotionStreak来实现.下面我们 ...
- 知识点整理之Java的Cookie操作
创建Cookie // new一个Cookie对象,键值对为参数 Cookie cookie = new Cookie("key", "value"); // ...
- JAVA Web 之 struts2文件上传下载演示(二)(转)
JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...
- 5 Things They Never Tell You About Making iPhone Apps
http://blog.teamtreehouse.com/5-things-they-never-tell-you-about-making-iphone-apps So, you've decid ...
- ArcGIS中文件共享锁定数据溢出 这个方法不行,建议用gdb,不要用mdb
ArcGIS中文件共享锁定数据溢出 (2011-11-24 15:52:41) 转载▼ 标签: 杂谈 分类: GIS 文件共享锁定数溢出.(Error 3052)1. Access数据库,同时操作大量 ...
- 从Kali 2.0 转至 Kali Rolling
1. 修改官方软件库列表 编辑/etc/apt/sources.list,注释掉原有内容,然后添加下述内容. # kali rolling deb http://http.kali.org/kali ...
- Clean Code 笔记 (一):命名
一.命名规范1.名副其实,通过名称我们知道它为什么存在,它做什么事,该怎么用2.避免误导,避免使用与本意相悖的词,提防使用不同之处较小的名称3.有意义的区分,去掉多余的废话比如:a,the.缺少明确约 ...
- 构建简单的socket连接池
一开始,选用Vector<E>来存放连接.由于这个容器不是并发安全的,于是,每个方法都加一个synchronized来保持并发时的同步操作,并发效率很差,果断放弃.空余时间研究了下多线程的 ...