Mysql: 利用强制索引去掉重数据

数据库版本:

[[email protected]mysqltest ~]# mysql -u root -p123456

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 389805

Server version: 5.1.73-community MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql>

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| cacti              |

| centreon           |

| centreon_status    |

| centreon_storage   |

| mysql              |

| syslog             |

| test               |

+--------------------+

8 rows in set (0.01 sec)

1 .创建实验使用的a b表

mysql> use test;

Database changed

mysql> show tables;

Empty set (0.00 sec)

mysql> create table a (a1 char(10), a2 char(10), a3 char(10));

Query OK, 0 rows affected (0.08 sec)

mysql> insert into a values (‘1‘, ‘2‘, ‘3‘);

Query OK, 1 row affected (0.00 sec)

mysql> insert into a select * from a;

Query OK, 1 row affected (0.00 sec)

Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into a select * from a;

Query OK, 4194304 rows affected (7.85 sec)

Records: 4194304  Duplicates: 0  Warnings: 0

mysql> insert into a select * from a;

Query OK, 8388608 rows affected (27.81 sec)

Records: 8388608  Duplicates: 0  Warnings: 0

2  创建b表:

mysql> create table b (b1 char (10), b2 char(10), b3 char(10));

Query OK, 0 rows affected (0.06 sec)

mysql> insert into b select * from a;

Query OK, 16777216 rows affected (1 min 6.18 sec)

Records: 16777216  Duplicates: 0  Warnings: 0

mysql>

mysql>

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

mysql>

mysql>

mysql> select * from b limit 10;

+------+------+------+

| b1   | b2   | b3   |

+------+------+------+

| 1    | 2    | 3    |

| 1    | 2    | 3    |

| 1    | 2    | 3    |

| 1    | 2    | 3    |

| 1    | 2    | 3    |

| 1    | 2    | 3    |

| 1    | 2    | 3    |

| 1    | 2    | 3    |

| 1    | 2    | 3    |

| 1    | 2    | 3    |

+------+------+------+

10 rows in set (0.04 sec)

3  加入b表不同样的数据

mysql> insert into b values (‘4‘,‘5‘,‘6‘);

Query OK, 1 row affected (0.01 sec)

mysql> insert into b values (‘4‘,‘5‘,‘6‘);

Query OK, 1 row affected (0.00 sec)

mysql> insert into b values (‘4‘,‘5‘,‘6‘);

Query OK, 1 row affected (0.00 sec)

mysql> insert into b values (‘4‘,‘5‘,‘6‘);

Query OK, 1 row affected (0.00 sec)

mysql>

mysql> insert into b values (‘4‘,‘5‘,‘6‘);

Query OK, 1 row affected (0.00 sec)

mysql> commit

-> ;

Query OK, 0 rows affected (0.00 sec)

mysql>

mysql>

mysql>

4 查看a b表数据行数

mysql> select count(1) from b;

+----------+

| count(1) |

+----------+

| 16777224 |

+----------+

1 row in set (0.00 sec)

mysql> select count(1) from a;

+----------+

| count(1) |

+----------+

| 16777216 |

+----------+

1 row in set (0.00 sec)

5 创建c表

mysql> create table c (c1 char (10), c2 char(10), c3 char(10));

Query OK, 0 rows affected (0.31 sec)

6 创建临时temp表

mysql> create table temp select * from c where 1=2;

Query OK, 0 rows affected (0.06 sec)

Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from temp;

Empty set (0.00 sec)

mysql> desc temp;

+-------+----------+------+-----+---------+-------+

| Field | Type     | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+-------+

| c1    | char(10) | YES  |     | NULL    |       |

| c2    | char(10) | YES  |     | NULL    |       |

| c3    | char(10) | YES  |     | NULL    |       |

+-------+----------+------+-----+---------+-------+

3 rows in set (0.02 sec)

7 为b表创建索引

mysql> create index ind_b_b1 on b(b1);

Query OK, 16777224 rows affected (2 min 9.14 sec)

Records: 16777224  Duplicates: 0  Warnings: 0

mysql> desc b;

+-------+----------+------+-----+---------+-------+

| Field | Type     | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+-------+

| b1    | char(10) | YES  | MUL | NULL    |       |

| b2    | char(10) | YES  |     | NULL    |       |

| b3    | char(10) | YES  |     | NULL    |       |

+-------+----------+------+-----+---------+-------+

3 rows in set (0.02 sec)

8 把a b表数据插入temp表中

mysql> insert into temp select * from a;

Query OK, 16777216 rows affected (29.84 sec)

Records: 16777216  Duplicates: 0  Warnings: 0

mysql> insert into temp select * from b;

Query OK, 16777224 rows affected (59.79 sec)

Records: 16777224  Duplicates: 0  Warnings: 0

mysql>

mysql>

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

mysql> select count(1) from temp;

+----------+

| count(1) |

+----------+

| 33554440 |

+----------+

1 row in set (0.00 sec)

9 创建联合索引      强制索引去掉重复数据

mysql> create index ind_temp_c123 on temp(c1, c2, c3);

Query OK, 33554440 rows affected (6 min 57.80 sec)

Records: 33554440  Duplicates: 0  Warnings: 0

mysql>

mysql>

mysql> explain select c1, c2, max(c3) from temp force index (ind_temp_c123) group by c1, c2;

+----+-------------+-------+-------+---------------+---------------+---------+------+------+--------------------------+

| id | select_type | table | type  | possible_keys | key           | key_len | ref  | rows | Extra                    |

+----+-------------+-------+-------+---------------+---------------+---------+------+------+--------------------------+

|  1 | SIMPLE      | temp  | range | NULL          | ind_temp_c123 | 22      | NULL |    3 | Using index for group-by |

+----+-------------+-------+-------+---------------+---------------+---------+------+------+--------------------------+

1 row in set (0.00 sec)

mysql> select count(*) from temp;

+----------+

| count(*) |

+----------+

| 33554440 |

+----------+

1 row in set (0.00 sec)

mysql> explain select c1, c2, c3 from temp force index (ind_temp_c123) group by c1, c2;

+----+-------------+-------+-------+---------------+---------------+---------+------+------+--------------------------+

| id | select_type | table | type  | possible_keys | key           | key_len | ref  | rows | Extra                    |

+----+-------------+-------+-------+---------------+---------------+---------+------+------+--------------------------+

|  1 | SIMPLE      | temp  | range | NULL          | ind_temp_c123 | 22      | NULL |    3 | Using index for group-by |

+----+-------------+-------+-------+---------------+---------------+---------+------+------+--------------------------+

1 row in set (0.00 sec)

mysql> insert into c select c1, c2, max(c3) from temp force index (ind_temp_c123) group by c1, c2;

Query OK, 2 rows affected (0.03 sec)

Records: 2  Duplicates: 0  Warnings: 0

10 去重复后c表的数据

mysql> select * from c;

+------+------+------+

| c1   | c2   | c3   |

+------+------+------+

| 1    | 2    | 3    |

| 4    | 5    | 6    |

+------+------+------+

2 rows in set (0.00 sec)

mysql>

mysql>

mysql> select * from temp order by c1 desc limit 10;

+------+------+------+

| c1   | c2   | c3   |

+------+------+------+

| 4    | 5    | 6    |

| 4    | 5    | 6    |

| 4    | 5    | 6    |

| 4    | 5    | 6    |

| 4    | 5    | 6    |

| 4    | 5    | 6    |

| 4    | 5    | 6    |

| 4    | 5    | 6    |

| 1    | 2    | 3    |

| 1    | 2    | 3    |

+------+------+------+

10 rows in set (0.00 sec)

mysql> Ctrl-C -- exit!

Aborted

11 删除表 temp

mysql> drop table temp;

Query OK, 0 rows affected (1.59 sec)

mysql> drop table a;

Query OK, 0 rows affected (0.55 sec)

mysql> drop table b;

Query OK, 0 rows affected (0.73 sec)

mysql> show tables;

+----------------+

| Tables_in_test |

+----------------+

| c              |

+----------------+

1 row in set (0.00 sec)

mysql>

时间: 2024-10-10 06:08:09

Mysql: 利用强制索引去掉重数据的相关文章

mysql利用唯一索引去重

在生产环境中,有时候我们会遇到这样的问题,就是去掉数据库中2列值相同的数据,并且留下一条语句,解决这个问题可以利用唯一联合索引 创建测试表 CREATE TABLE `test03` (`id` INT(11) ,`uid` INT(11) DEFAULT NULL); INSERT INTO test03(id,uid) VALUES (1,1),(1,2),(1,1),(1,2),(1,1); select * from test03; id    uid 1    1 1    2 1  

mysql利用mysqlbinlog命令恢复误删除数据

实验环境: MYSQL 5.7.22 开启二进志日志 日志格式MIXED 实验过程: 1.执行:FLUSH LOGS; master-bin.000014 文件就是新生成的文件 刷新日志是为了实验内容更直观,更容易观察到整个实验过程的内容. 我看到网上许多文章有在用REST MASTER;而未说明此命令的严重性 这条命令会删除所有日志文件,并将文件名和记录点进行重置归零,99%的情况下是用不到这条命令的 删除日志可以用PURGE MASTER LOGS...这样保险一点 2.新日志文件已经生成,

Mysql利用存储过程插入400W条数据

CREATE TABLE dept( /*部门表*/ deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*编号*/ dname VARCHAR(20) NOT NULL DEFAULT "",/*名称*/ loc VARCHAR(13) NOT NULL DEFAULT "" /*地点*/ )ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE emp( /*EMP雇员表*/ e

mysql force index() 强制索引的使用

mysql force index() 强制索引的使用 之前跑了一个SQL,由于其中一个表的数据量比较大,而在条件中有破坏索引或使用了很多其他索引,就会使得sql跑的非常慢... 那我们怎么解决呢? 这时候我么可以使用mysql force index() 强制索引来优化查询语句: 使用MySQL force index 强制索引的目的是对目标表添加最关键的索引,使其优先使用该索引筛选数据: select * from ws_shop a where date(create_time-inter

MySQL force Index 强制索引概述

以下的文章主要介绍的是MySQL force Index  强制索引,以及其他的强制操作,其优先操作的具体操作步骤如下:我们以MySQL中常用的hint来进行详细的解析,如果你是经常使用Oracle的朋友可能知道,Oracle的hincvt功能种类很多,对于优化sql语句提供了很多方法. 同样,在MySQL里,也有类似的hint功能.下面介绍一些常用的. 强制索引MySQL FORCE INDEX SELECT * FROM TABLE1 FORCE INDEX (FIELD1) … 以上的SQ

mysql 优化策略(如何利用好索引)

命名规则:表名_字段名1.需要加索引的字段,要在where条件中2.数据量少的字段不需要加索引3.如果where条件中是OR关系,加索引不起作用4.符合最左原则 https://segmentfault.com/q/1010000003984016/a-1020000003984281 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c

利用PHP实现登录与注册功能以及使用PHP读取mysql数据库——以表格形式显示数据

登录界面 <body><form action="login1.php" method="post"><div>用户名:<input type="text" name="uid" /></div><br /><div>密码:<input type="password" name="pwd" />

mysql强制索引和禁止某个索引

1.mysql强制使用索引:force index(索引名或者主键PRI) 例如: select * from table force index(PRI) limit 2;(强制使用主键) select * from table force index(ziduan1_index) limit 2;(强制使用索引"ziduan1_index") select * from table force index(PRI,ziduan1_index) limit 2;(强制使用索引&quo

利用sys.dm_db_index_physical_stats查看索引碎片等数据(转)

我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而索引在对数据进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,就需要重新组织或重新生成索引,以达到索引的最大效率. 那么我们要如何知道索引的碎片大小呢?在sql server中,碎片的大小是使用碎片比来体现的,按msdn上面的说法,如果碎片比小于30%,我们可以重新组织索引,如果碎片比大于等于30%,我们可以选择重新生成索引. 那么我们在那里可以查看到碎片比呢?最简单的就是在microsoft sql