系统变量: show variables like '%xxx%'; 只读状态: show status like '%xxx%'; 或infomation_schema.global_status表和information_schama.session_status表; 其他信息:infomation_schema库中
using index: 使用覆盖索引; using where: 从存储引擎返回后,需要在服务器再过滤一次;(可能暗示查询可以加更多索引) using temporary: 查询结果排序时会使用临时表; using filesort: 排序时会使用外部索引排序,而不是按索引顺序扫描; range checked for each record: 没有理想的索引,对于连接后的每一行重新检查使用哪个索引(很慢)。
可以用Percona Toolkit的pt-visual-explain获得树形执行计划。
高性能mysql附录E-笔记-锁的调试
锁的类型:
表锁;
全局锁: flush tables with read lock或设置read_only=1
命名锁:表锁的一种,重命名或者删除表时创建;
字符锁:可以用get_lock等函数在服务器级别锁住/释放单个字符。
表锁
显式
1 2 3
locktables film read; locktables film write; unlocktables ...;
隐式
1 2
selectsleep(30) from film limit1 -- 相当于lock tables film read;
可以用mysqladmin debug命令检测锁的持有信息。(输出的末尾)
全局读锁
show processlist中status是waiting for release of readlock时,就是等待全局读锁了。
命名锁
show processlist中status是waiting for table时,就是等待命名锁了。 还可以在show open tables中看到命名锁的影响。
SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, b.trx_query blocking_query FROM information_schema.innodb_lock_waits w INNERJOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id INNERJOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;
查看阻塞查询的线程元凶:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
SELECT CONCAT('thread ', b.trx_mysql_thread_id, ' from ', p.host) AS who_blocks, IF(p.command = "Sleep", p.time, 0) AS idle_in_trx, MAX(TIMESTAMPDIFF(SECOND, r.trx_wait_started, CURRENT_TIMESTAMP)) AS max_wait_time, COUNT(*) AS num_waiters FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w INNERJOIN INFORMATION_SCHEMA.INNODB_TRX AS b ON b.trx_id = w.blocking_trx_id INNERJOIN INFORMATION_SCHEMA.INNODB_TRX AS r ON r.trx_id = w.requesting_trx_id LEFTJOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id GROUPBY who_blocks ORDERBY num_waiters DESC; +-------------------------+-------------+---------------+-------------+ | who_blocks | idle_in_trx | max_wait_time | num_waiters | +-------------------------+-------------+---------------+-------------+ | thread 4 from localhost | 98 | 12 | 1 | +-------------------------+-------------+---------------+-------------+
selectsum(index_length) from information_schema.tables whereengine='MYISAM'; -- 也可以看看分布: selectengine,sum(index_length) from information_schema.tables GROUPBYengine;
2.如果超过多数Acceptor的承诺,又分为不同情况: (1)如果所有Acceptor返回的value都是null,那么向所有的Acceptor发送(n,value_n); (2)如果存在Acceptor返回的value不为null,那么从所有接受过的值中选择对应的n_old最大的作为提议的值value_old,提议编号仍然为n。但此时Proposer就不能提议自己的值,只能信任Acceptor通过的值,维护一但获得确定性取值就不能更改原则: 向所有Acceptor发送(n,value_old of max n_old)。