表的范式、是首先符合1NF 才能符合2NF 进一步满足 3NF
第一范式:1NF是对属性的原子性约束,要求属性(列)具有原子性,不可再分解 (只要是关系型数据库 自动满足第一范式)
第二范式:2NF是对记录的唯一性约束,要求每条记录既有唯一性 即实体的唯一性 (通常使用主键来完成,主键ID一般不包含业务逻辑,正因为不包含业务逻辑所以数据稳定)
第三范式:3NF是对字段的冗余性约束,要求字段完全没有冗余。(一个字段的内容重复出现多次或者可以在另一张表中可以推算出来的数据 即为冗余数据)

反范式化

反范式化指的是通过增加冗余或重复的数据来提高数据库的读性能。

备注:但是有些情况下 完全符合3NF的数据库也未必是好的数据库,有时候为了提高效率,可以适当的冗余数据,降低3NF标准,具体做法是:
在表的 1对N 情况下 可能会在1的那边设置一个 在为了提高效率 会在1那边设置一个反三范式的字段提速

在phpMyAdmin中提示“Configuration of pmadb… not OK”,这个问题不大,不影响使用,仅仅是一个警告。如果不想总是看见这个警告,可以用如下办法来解决。

解决办法
(1)初始化phpmyadmin数据库
cd /path/phpmyadmin/sql
mysql -u root -p < create_tables.sql
Enter password:

(2)创建数据库用户
CREATE USER ‘pma’@’localhost’ IDENTIFIED BY ‘pmapass’;
GRANT ALL PRIVILEGES ON `phpmyadmin`.* TO ‘pma’@’localhost’ WITH GRANT OPTION;
FLUSH PRIVILEGES;

(3)配置config.ini.php文件
将如下的程序段取消注释
/* User used to manipulate with storage */
$cfg[‘Servers”;][$i][‘controlhost’] = ”;
$cfg[‘Servers’][$i][‘controlport’] = ”;
$cfg[‘Servers’][$i][‘controluser’] = ‘pma’;
$cfg[‘Servers’][$i][‘controlpass’] = ‘pmapass

/* Storage database and tables */
$cfg[‘Servers’][$i][‘pmadb’] = ‘phpmyadmin’;
$cfg[‘Servers’][$i][‘bookmarktable’] = ‘pma__bookmark’;
$cfg[‘Servers’][$i][‘relation’] = ‘pma__relation’;
$cfg[‘Servers’][$i][‘table_info’] = ‘pma__table_info’;
$cfg[‘Servers’][$i][‘table_coords’] = ‘pma__table_coords’;
$cfg[‘Servers’][$i][‘pdf_pages’] = ‘pma__pdf_pages’;
$cfg[‘Servers’][$i][‘column_info’] = ‘pma__column_info’;
$cfg[‘Servers’][$i][‘history’] = ‘pma__history’;
$cfg[‘Servers’][$i][‘table_uiprefs’] = ‘pma__table_uiprefs’;
$cfg[‘Servers’][$i][‘tracking’] = ‘pma__tracking’;
$cfg[‘Servers’][$i][‘userconfig’] = ‘pma__userconfig’;
$cfg[‘Servers’][$i][‘recent’] = ‘pma__recent’;
$cfg[‘Servers’][$i][‘favorite’] = ‘pma__favorite’;
$cfg[‘Servers’][$i][‘users’] = ‘pma__users’;
$cfg[‘Servers’][$i][‘usergroups’] = ‘pma__usergroups’;
$cfg[‘Servers’][$i][‘navigationhiding’] = ‘pma__navigationhiding’;
$cfg[‘Servers’][$i][‘savedsearches’] = ‘pma__savedsearches’;
$cfg[‘Servers’][$i][‘central_columns’] = ‘pma__central_columns’;

1.mysql 查询一个表中没有存在在另一个表的数据

SELECT * FROM A
WHERE  id  NOT  IN  ( SELECT id FROM B);

或者
SELECT * FROM A
WHERE
NOT  EXISTS  (
SELECT 1
FROM B
WHERE B.id = A.id );

或者
SELECT
A.*
FROM
A  LEFT JOIN B
ON (A.id = B.id)
WHERE
b.id  IS  NULL

2.Mysql中怎么筛选一个表之后然后再和另外一个表做表连接

例如A表有id,name,adress字段,B表有id,country,work字段,现在我想筛选表A中id大于10的列然后,筛选后的表和B表进行连接
select a.id , a.name ,a.adress,B.country from
( select * from A where id>10) a
join B on a.id=B.id
3.mysql根据一个表的id删除另一个表的记录
delete from Awhere id in (select id from B)。

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

    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处理,执行了几次才完成