同步操作将从 Java精选/Ebooks 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
SQL标准定义了四种隔离级别,包括一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
Read uncommitted (读未提交)
Read Committed也被称之为脏读(Dirty Read)。所有事务都可以看到其他未提交事务的执行结果。这个隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。
Read Committed(读已提交)
大多数数据库系统的默认隔离级别,但不是MySQL默认的。
Read Committed满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read(可重复读)
Repeatable Read是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。
不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(串行化)
Serializable是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言来说它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
覆盖索引:查询列要被所建的索引覆盖,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。
回表:二级索引无法直接查询所有列的数据,所以通过二级索引查询到聚簇索引后,再查询到想要的数据,这种通过二级索引查询出来的过程,就叫做回表。
在B+树的索引中,叶子节点可能存储了当前的key值,也可能存储了当前的key值以及整行的数据,这就是聚簇索引和非聚簇索引。在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。
当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询。
选择唯一性索引
唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录
作为查询条件的字段建立索引
某个字段用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为该字段建立索引,可以提高整个表的查询速度
限制索引的数量
索引的数量并不是越多越好,每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。
修改表时,索引过多会使得更新表速度变慢
尽量使用字段数据量少的索引
若索引的字段数据量过长,会导致查询的速度变慢
如:对一个char(200)类型的字段进行全文检索需要的时间肯定比对char(10)类型的字段需要的时间更多
排序、分组和联合字段建立索引
使用order by、group by、distinct和union等操作的字段进行排序操作会浪费很多时间。若为其建立索引,可以有效的避免排序操作
尽量使用前缀索引
索引字段的值很长,最好使用值的前缀来索引
如:text和blog类型的字段,进行全文检索会浪费时间。若只检索字段的部分若干个字符,可以提高检索速度
删除不使用或者很少使用的索引
表中数据被批量更新或数据的使用方式被改变后,原有的一些索引可能不再需要。应当定期清理这些索引
小表不创建索引(超过200w数据的表,创建索引)
包含很多列且不需要搜索非空值时可以考虑不建索引
被用来过滤记录的字段创建索引
primary key 字段,系统自动创建主键的索引 unique key 字段,系统自动创建对应的索引 foreign key 约束所定义的作为外键的字段 在查询中用来连接表的字段 用作为排序(order by的字段)的字段
创建索引必须考虑数据的操作方式,原则是内容变动少,经常被用于查询的字段创建索引,对于经常性变动的表而言,则需要谨慎创建必要的索引
MySQL数据库中有六种触发器:
Before Insert
After Insert
Before Update
After Update
Before Delete
After Delete
非聚集索引也称为Secondary Index。指的是非叶子节点按照索引的键值顺序存放,叶子节点存放索引键值以及对应的主键键值。
MySQL里除了INNODB表主键外,其他的都是二级索引。MYISAM、memory等引擎的表索引都是非聚集索引。简单点说,就是索引与行数据分开存储。一张表可以有多个二级索引。
执行效果上来说:
count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL。
count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL。
count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。
执行效率上来说:
列名为主键,count(列名)会比count(1)快;而列名不为主键,count(1)会比count(列名)快。
如果表多个列并且没有主键,则count(1)的执行效率优于count(*) ,反之如果有主键,则select count(主键)的执行效率最优。
如果表只有一个字段,则select count(*)最优。
实例分析:
mysql> create table counttest(name char(1), age char(2));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into counttest values
-> ('a', '14'),('a', '15'), ('a', '15'),
-> ('b', NULL), ('b', '16'),
-> ('c', '17'),
-> ('d', null),
->('e', '');
Query OK, 8 rows affected (0.01 sec)
Records: 8 Duplicates: 0 Warnings: 0
mysql> select * from counttest;
+------+------+
| name | age |
+------+------+
| a | 14 |
| a | 15 |
| a | 15 |
| b | NULL |
| b | 16 |
| c | 17 |
| d | NULL |
| e | |
+------+------+
8 rows in set (0.00 sec)
mysql> select name, count(name), count(1), count(*), count(age), count(distinct(age))
-> from counttest
-> group by name;
+------+-------------+----------+----------+------------+----------------------+
| name | count(name) | count(1) | count(*) | count(age) | count(distinct(age)) |
+------+-------------+----------+----------+------------+----------------------+
| a | 3 | 3 | 3 | 3 | 2 |
| b | 2 | 2 | 2 | 1 | 1 |
| c | 1 | 1 | 1 | 1 | 1 |
| d | 1 | 1 | 1 | 0 | 0 |
| e | 1 | 1 | 1 | 1 | 1 |
+------+-------------+----------+----------+------------+----------------------+
5 rows in set (0.00 sec)
key是数据库的物理结构,它包含两层意义和作用,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的)。包括primary key、unique key、foreign key等。
index是数据库的物理结构,它只是辅助查询的,它创建时会在另外的表空间(mysql中的innodb表空间)以一个类似目录的结构存储。索引要分类的话,分为前缀索引、全文本索引等;
1、查看是否涉及多表和子查询,优化Sql结构,如去除冗余字段,是否可拆表等。
2、优化索引结构,看是否可以适当添加索引。
3、数量大的表,可以考虑进行分离/分表(如交易流水表)。
4、数据库主从分离,读写分离。
5、explain分析sql语句,查看执行计划,优化sql。
6、查看mysql执行日志,分析是否有其他方面的问题。
不一定,如果查询语句的字段全部命中了索引,那么就不必再进行回表查询。
举个简单例子,假设在用户表上建立索引,那么当进行
select age from user where age < 20;
查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。