最近工作时遇到一个挺奇怪的问题,在Eclipse中启动工程时总是会报下面的错误,导致项目启动失败:
标签归档:database
使用MERGE存储引擎实现MySQL的分表机制
当一张表的数据量达到上百万条记录时,单台MySQL数据库采用传统的单表方式就很有可能无法满足业务的性能需求。解决这种性能问题的技术方案很多,包括分表、分库或搭建MySQL集群,每种技术方案又分别有若干种实现方式。本文将通过实例描述如何使用MERGE
存储引擎实现MySQL的分表机制,不会涉及其他的技术方案或实现方式。
一、建立数据库
如何查看MySQL中的数据大小?
以下方法可用于查看MySQL中各个级别数据的大小:
1. 查看MySQL中所有数据的大小
-- 使用信息数据库
use information_schema;
-- 查看所有数据的总大小
select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from TABLES;
2. 查看MySQL中指定数据库的大小
-- 使用信息数据库
use information_schema;
-- 查看指定数据库的大小
select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from TABLES where table_schema=<schema_name>;
3. 查看MySQL中指定表的大小
-- 使用信息数据库
use information_schema;
-- 查看指定表的大小
select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from TABLES where table_schema=<schema_name> and table_name=<table_name>;
注意
MySQL的Query Cache详解
一、原理概述
Query Cache就是把“查询返回的结果”缓存起来。但是,仅仅只是缓存“查询返回的结果”,其实是不准确的,Query Cache还会缓存查询语句,在内存中将“查询语句”和“查询返回的结果”映射起来。
当MySQL接收到一条SELECT
类型的查询语句时,MySQL会对这条查询语句进行hash计算而得到一个hash值。然后,通过该hash值到Query Cache中去匹配。如果没有得到匹配结果,则会将这个hash值存放在一个hash链表中,同时将此次查询的结果存放至缓存中。存放hash值的链表的每个节点都会存放相应查询返回结果在缓存中的地址,以及该次查询所涉及到的一些表的相关信息。如果通过hash值匹配到相同的查询,则会直接将缓存中相应的查询结果返回给客户端。如果MySQL的任何一张表中的任何一条数据发生了变化,便会通知Query Cache,将和这张表相关的查询缓存全部失效,并释放占用的内存空间。修改表数据的操作包括:INSERT
、UPDATE
、DELETE
、TRUNCATE
、ALTER TABLE
、DROP TABLE
和DROP DATABASE
等等。
外键关系:identifying和non-identifying
判别一个实体关系是Non-Identifying
(非标识关系)还是Identifying
(标识关系),只要区分子实体的主键,看是否需要父实体的外键来共同作为主键,需要则为Identifying
,如果子实体自己的主键就可唯一标识,则它为Non-Identifying
!
事务并发和事务隔离级别
一、事务并发问题
1. 丢失更新
撤销一个事务时,把其他事务已提交的更新数据覆盖(A和B事务并发执行,A事务执行更新之后提交;B事务在A事务更新之后,B事务结束之前也做了对该行数据的更新操作,然后回滚,则两次更新操作都丢失了)。
2. 脏读
一个事务读取到另一个事务未提交的更新数据(A和B事务并发执行,B事务执行更新之后,A事务查询B事务没有提交的数据,B事务回滚,则A事务得到的数据不是数据库中的真实数据。也就是脏数据,即和数据库中不一致的数据)。