在 MySQL中,可以使用函数 PROCEDURE ANALYSE()对当前应用的表进行分析,该函数可以对数据表中列的数据类型 出优化建议
SELECT * FROM duck_custPROCEDURE ANALYSE()\G;
19.2 通过拆分提高表的访问效率
垂直拆分,水平拆分。都不好用。
19.3 逆规范化
对于查询较多的应用就需要根据实际情况运用逆规范化对数据进行设计,通过逆规范化来 高查询的性能。
反规范的好处是降低连接操作的需求、降低外码和索引的数目,还可能减少表的数目,相应带来的问题是可能出现数据的完整性问题。
ch20 锁
表级锁 table,行级锁 line,页面锁 page.
innodb: line, table
mysql> show status like 'table%';
+-----------------------+------------+
| Variable_name | Value |
+-----------------------+------------+
| Table_locks_immediate | 1999035971 |
| Table_locks_waited | 8547 |
+-----------------------+------------+
2 rows in set (0.01 sec)
MySQL 的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。
MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值
分别可以为0、1或2。
InnoDB
InnoDB 与 MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。
+-------------------------------+-----------+
| Variable_name | Value |
+-------------------------------+-----------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 236618376 |
| Innodb_row_lock_time_avg | 790 |
| Innodb_row_lock_time_max | 51952 |
| Innodb_row_lock_waits | 299353 |
+-------------------------------+-----------+
5 rows in set (0.00 sec)
InnoDB 使用间隙锁的目的,一方面是为了防止幻读,以满足相关隔离级别的要求
另外一方面,是为了满足其恢复和复制的需要。