
可以分表
你把实际情况贴出来下,不一定分表能更快,可以考虑其他方法
举个例子 select from T1 where `creattime` > '2015-01-01 00:00:00'
百万级表
效率远远低于
select fromr T1 where `id` > (select `id` from T1 where `creattime` > '2015-01-01 00:00:00' order by id desc limit 0,1);
先考虑查询效率优化语法,在考虑分表
数据库涉及各种领域。即使同一领域也有不同需求,且有各种数据库软件,分库是很正常的。一个数据库内需要各种关系表,来避免冗余信息,使得数据库储存、检索效率提高。
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。
在信息化社会,充分有效地管理和利用各类信息资源,是进行科学研究和决策管理的前提条件。数据库技术是管理信息系统、办公自动化系统、决策支持系统等各类信息系统的核心部分,是进行科学研究和决策管理的重要技术手段。
分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,MYI索引文件,frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去 *** 作它。
对于数据量很大的一张表,i/o效率底下,分表势在必行!
使用程序分,对不同的查询,分配到不同的子表中,是个解决方案,但要改代码,对查询不透明。
好在mysql 有两个解决方案:
Partition(分区,在MySQL 51中实现) 和 Mysql Merge存储引擎。
本文讨论 Mysql Merge存储引擎。
CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
对应定期分表的情况下,只要定期相应的增加一个基础表,再修改merge表中的 union 就行了(ALTER TABLE tbl_name UNION=())。
如在增加一个表(需和其他基础表一样的结构):
CREATE TABLE t3( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
ALTER TABLE total UNION=(t1,t2,t3)
INSERT_METHOD=LAST;表示插入的方法,INSERT_METHOD的值可以是 FIRST(插入第一个表),LAST(最后一个表),NO(不能插入)
查询的时候,和平常一样
select from total where
merge表会自动找到相应的基础表进行查询。
需要注意的是 merge表并不维护 “唯一性”检查,唯一性有各基础表完成。所以插入新的记录时候可能和其他基础表的内容重复。所以再插入去需要用代码进行唯一性检查。
垂直分表,指的是把主键字段拿出来,分的两个表都有,然后原表其他字段根据实际情况,例如查询频率,放两个表中。
水平分表相当于数据存储拆开,建多个表,每个表字段完全一样,存放不同数据,例如按照月份存放
以上就是关于mysql单数据库实例可以分库分表提供查询效率吗全部的内容,包括:mysql单数据库实例可以分库分表提供查询效率吗、数据库为什么分库分表、什么是分表和分区 MySql数据库分区和分表方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)