要想知道每个数据库的大小的话,步骤如下 :

    1、进入information_schema 数据库(存放了其他的数据库的信息,重要 如果是navicat必须切换到information_schema数据库)

use information_schema;

2、查询所有数据的大小:

select concat(round(sum(data_length/1024/1024),2),’MB’) as data from tables;

3、查看指定数据库的大小:

比如查看数据库home的大小

select concat(round(sum(data_length/1024/1024),2),’MB’) as data from tables where table_schema=’home’;

4、查看指定数据库的某个表的大小

比如查看数据库home中 members 表的大小

select concat(round(sum(data_length/1024/1024),2),’MB’) as data from tables where table_schema=’home’ and table_name=’members’;

 

如国你不喜欢切换数据库  你可以这样写

select concat(round(sum(data_length/1024/1024),2),’MB’) as data from information_schema.tables where table_schema=’home’;

先说一下需求,最近做获取微信用户openid的时候  由于Chrome拉数据的时候出了问题,100万的数据  重复了80多万。那么这里需要把openid去重

 

附录:查询表数量相关
SELECT COUNT(age) FROM tableA
SELECT COUNT(DISTINCT age) from tableA

1.网上的一种说法,我试了一半不试了,太™慢了这里贴出来

先对要去重的表进行索引(处理重复的那个字段).将数据group by后导入到新的表中,导入时,可能需要分多次导入,因为电脑的内存有限,设置一下tmp_table_size或许可以一下子多导点
使用sql如下: Insert into Table2 select * from Table1 group by 重复字段名称 limit 100000
使用以上SQL,并个性Limit参数多进行几次导入操作即可

Insert into m_temp select * from temps group by openid limit 440000,10000;

2.这个方法亲测可以用  delete from 表名 where 字段ID in (select * from (select max(字段ID) from 表名 group by 重复的字段 having count(重复的字段) > 1) as b);

delete from temps where id in (select * from (select max(id) from temps group by openid having count(openid) > 1) as b);

我用的是navicat处理,执行了几次才完成

一,先说一下为什么要分表

当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。

根据个人经验,mysql执行一个sql的过程如下:
1,接收到sql;2,把sql放到排队队列中 ;3,执行sql;4,返回执行结果。在这个执行过程中最花时间在什么地方呢?第一,是排队等待的时间,第二,sql的执行时间。其实这二个是一回事,等待的同时,肯定有sql在执行。所以我们要缩短sql的执行时间。

mysql中有一种机制是表锁定和行锁定,为什么要出现这种机制,是为了保证数据的完整性,我举个例子来说吧,如果有二个sql都要修改同一张表的同一条数据,这个时候怎么办呢,是不是二个sql都可以同时修改这条数据呢?很显然mysql对这种情况的处理是,一种是表锁定(myisam存储引擎),一个是行锁定(innodb存储引擎)。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。如果数据太多,一次执行的时间太长,等待的时间就越长,这也是我们为什么要分表的原因。

二,分表

1,做mysql集群,例如:利用mysql cluster ,mysql proxy,mysql replication,drdb等等

有人会问mysql集群,根分表有什么关系吗?虽然它不是实际意义上的分表,但是它启到了分表的作用,做集群的意义是什么呢?为一个数据库减轻负担,说白了就是减少sql排队队列中的sql的数量,举个例子:有10个sql请求,如果放在一个数据库服务器的排队队列中,他要等很长时间,如果把这10个sql请求,分配到5个数据库服务器的排队队列中,一个数据库服务器的队列中只有2个,这样等待时间是不是大大的缩短了呢?这已经很明显了。所以我把它列到了分表的范围以内,我做过一些mysql的集群:

linux mysql proxy 的安装,配置,以及读写分离

mysql replication 互为主从的安装及配置,以及数据同步

优点:扩展性好,没有多个分表后的复杂操作(php代码)

缺点:单个表的数据量还是没有变,一次操作所花的时间还是那么多,硬件开销大。

2,预先估计会出现大数据量并且访问频繁的表,将其分为若干个表

这种预估大差不差的,论坛里面发表帖子的表,时间长了这张表肯定很大,几十万,几百万都有可能。 聊天室里面信息表,几十个人在一起一聊一个晚上,时间长了,这张表的数据肯定很大。像这样的情况很多。所以这种能预估出来的大数据量表,我们就事先分出个N个表,这个N是多少,根据实际情况而定。以聊天信息表为例:

我事先建100个这样的表,message_00,message_01,message_02……….message_98,message_99.然后根据用户的ID来判断这个用户的聊天信息放到哪张表里面,你可以用hash的方式来获得,可以用求余的方式来获得,方法很多,各人想各人的吧。下面用hash的方法来获得表名:

<?php
function get_hash_table($table,$userid) {
$str = crc32($userid);
if($str<0){
$hash = “0”.substr(abs($str), 0, 1);
}else{
$hash = substr($str, 0, 2);
}

return $table.”_”.$hash;
}

echo get_hash_table(‘message’,’user18991′);     //结果为message_10
echo get_hash_table(‘message’,’user34523′);    //结果为message_13
?>

Read More →

想进行php的事务处理有下面几个步骤
1.关闭自动提交
2.开启事务处理
3.有异常就自动抛出异常提示再回滚
4.开启自动提交
下面是一个小示例利用pdo进行的php mysql事务处理,注意mysql只有这个InnoDB驱动是支持事务处理的,默认MyIsAM驱动不支持

<?php
   try{
       $pdo=new pdo(“mysql:host=localhost;dbname=xsphpdb”, “root”, “123456”, array(PDO::ATTR_AUTOCOMMIT=>0));//最后是关闭自动提交
       //$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);//这个是通过设置属性方法进行关闭自动提交和上面的功能一样
       $pdo->setAttribute(PDO::ATTR_ERRMODE,  PDO::ERRMODE_EXCEPTION);//开启异常处理
   }catch(PDOException $e){
       echo “数据库连接失败:”.$e->getMessage();
       exit;
   }
   
   try{
       $pdo->beginTransaction();//开启事务处理       
       $price=500;
       $sql=”update zhanghao set price=price-{$price} where id=1″;
       $affected_rows=$pdo->exec($sql);
       if(!$affected_rows)
           throw new PDOException(“张三转出失败”);//那个错误抛出异常
       $sql=”update zhanghao set price=price+{$price} where id=3″;
       $affected_rows=$pdo->exec($sql);      
       if(!$affected_rows)
           throw new PDOException(“向李四转入失败”);
       echo “交易成功!”;
       $pdo->commit();//交易成功就提交
   }catch(PDOException $e){
       echo $e->getMessage();
       $pdo->rollback();
    
   $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);//自动提交,如果最后不自动提交,转账是不成功的  
   //设置错误报告模式 ERRMODE_SILENT    ERRMODE_WARNING

//主键

alter table tabelname add new_field_id int(5) unsigned default 0 not null auto_increment ,add primary key (new_field_id);
//增加一个新列

alter table t2 add d timestamp;
alter table infos add ex tinyint not null default ‘0’;
//删除列

alter table t2 drop column c;
//重命名列

alter table t1 change a b integer;

//改变列的类型

alter table t1 change b b bigint not null;
alter table infos change list list tinyint not null default ‘0’;
//重命名表

alter table t1 rename t2;
加索引

mysql> alter table tablename change depno depno int(5) not null;
mysql> alter table tablename add index 索引名 (字段名1[,字段名2 …]);
mysql> alter table tablename add index emp_name (name);
加主关键字的索引

mysql> alter table tablename add primary key(id);
加唯一限制条件的索引

mysql> alter table tablename add unique emp_name2(cardnumber);
删除某个索引

mysql>alter table tablename drop index emp_name;
修改表:

增加字段:

mysql> ALTER TABLE table_name ADD field_name field_type;
修改原字段名称及类型:

mysql> ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;
删除字段:

mysql> ALTER TABLE table_name DROP field_name;

来源:http://www.blogjava.net/Alpha/archive/2007/07/23/131912.html