精华内容
下载资源
问答
  • 数据量已经达到百万, 但是本身有8个索引, 需要确认一下能不能再添加索引? 索引数量 和 插入性能之间的权衡点是多少?
  • 发现mysql一个表可以几个唯一索引

    千次阅读 2018-04-26 09:07:44
    这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率。二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将...

    mysql一个表可以有多个唯一索引

    如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引

    这么做的好处:

    一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率。

    二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。

    也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

    展开全文
  • 一个最多16个索引,最大索引长度256字节。 索引一般不明显影响插入性能(大量小数据例外),因为建立索引的时间开销是O(1)或者O(logN)。

    一个表最多16个索引,最大索引长度256字节。

    索引一般不明显影响插入性能(大量小数据例外),因为建立索引的时间开销是O(1)或者O(logN)。

    展开全文
  • 需要在一张1800万数据量的中添加加一字段并添加索引,但是直接添加会导致mysql崩溃或者锁时间太长影响用户操作,所以需要利用其他的方法进行添加,这篇文章主要给大家介绍了MySQL中大数据表增加字段,增加索引...

    最近遇到的一个问题,需要在一张1800万数据量的表中添加加一个字段并添加索引,但是直接添加会导致mysql崩溃或者锁表时间太长影响用户操作,所以需要利用其他的方法进行添加,这篇文章主要给大家介绍了MySQL中大数据表增加字段,增加索引的实现过程,需要的朋友可以参考借鉴。


    普通的添加字段sql

    ALTER TABLE `table_name`
    ADD COLUMN `num`  int(10) NOT NULL DEFAULT 0 AFTER `addtime`;

    普通的添加索引sql

    ALTER TABLE `table_name` ADD INDEX `num` (`num`) ;

    但是线上的一张表如果数据量很大呢,执行加字段操作就会锁表,这个过程可能需要很长时间甚至导致服务崩溃,那么这样操作就很有风险了。

    在网上查找的给 MySQL 大表加字段的思路如下:

    ① 创建一个临时的新表,首先复制旧表的结构(包含索引)

    ② 给新表加上新增的字段

    ③ 把旧表的数据复制过来

    ④ 删除旧表,重命名新表的名字为旧表的名字


    实现过程大概就是这样,下面我会附带我实现的sql:


    ① 创建一个临时的新表,首先复制旧表的结构(包含索引)

    create table new_table like old_table;

    ② 给新表加上新增的字段 增加索引

    ALTER TABLE `table_name`
    ADD COLUMN `num`  int(10) NOT NULL DEFAULT 0 AFTER `addtime`;
    
    ALTER TABLE `table_name` ADD INDEX `num` (`num`) ;

    ③ 把旧表的数据复制过来

    insert into new_table(id,name,content,addtime) select id,name,content,addtime from old_table;

    注意:执行这步的时候,可能这个过程也需要时间,这个时候有新的数据进来,所以原来的表如果有字段记录了数据的写入时间就最好了,可以找到执行这一步操作之后的数据,并重复导入到新表,直到数据差异很小。不过还是会可能损失极少量的数据。所以,如果表的数据特别大,同时又要保证数据完整,最好停机操作。

    我操作的时候是选取的一个低峰期时间操作的,减少数据差距。


    ④ 旧表的名字修改为别的名,重命名新表的名字为旧表的名字

    留一个备用表,可以等新表完全没问题再删除


    总结:

    一般情况下,十几万的数据量,可以直接进行加字段操作。因为我这个表数据量太大所以需要其他方法操作。以上就是关于在MySQL大表中加字段加索引的实现思路和步骤。

    参考地址:http://www.jb51.net/article/103692.htm



    展开全文
  • 一、背景 一张person,有id和name的两字段,id是唯一的不允许重复,id相同则认为是重复的记录。二、解决 select id from group by id having count(*) > 1 按照id分组并计数,某个id号那一组的数量...

    一、背景

      一张person表,有id和name的两个字段,id是唯一的不允许重复,id相同则认为是重复的记录。

    二、解决

      select id from group by id having count(*) > 1

      按照id分组并计数,某个id号那一组的数量超过1条则认为重复。

    如何查询重复的数据

    1
    select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1

    PS:将上面的>号改为=号就可以查询出没有重复的数据了。

    Oracle删除重复数据的SQL(删除所有):

    删除重复数据的基本结构写法:

    想要删除这些重复的数据,可以使用下面语句进行删除

    1
    2
    delete from 表名 a where 字段1,字段2 in
    (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)

    上面的SQL注意:语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。

    建议先将查询到的重复的数据插入到一个临时表中,然后对进行删除,这样,执行删除的时候就不用再进行一次查询了。如下:

    CREATE TABLE 临时表 AS  (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)

    上面这句话就是建立了临时表,并将查询到的数据插入其中。

    下面就可以进行这样的删除操作了:

    1
    delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);

    Oracle删除重复数据

    的SQL(留下一条记录):

    oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录,我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。

    使用ROWID查询重复数据:

    1
    2
    3
    4
    5
    select a.rowid,a.* from 表名 a
    where a.rowid !=
    (select max(b.rowid) from 表名 b
    where a.字段1 = b.字段1 and
    a.字段2 = b.字段2 )

    括号中的SQL查询出rowid最大的记录,而外面就是查询出除了rowid最大之外的其他重复的数据了。

    由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:

    删除重复数据(留下最大ROWID的一条)

    1
    2
    3
    4
    delete from 表名 a where a.rowid !=
    (select max(b.rowid) from 表名 b
    where a.字段1 = b.字段1 and
    a.字段2 = b.字段2 )

    删除重复数据(留下最小ROWID的一条)

    1
    2
    3
    delete tab t where t.rowid > (
      select min(t2.rowid) from tab t2 where t.col2 = t2.col2 and t.col8 = t2.col8
    )

    当然,上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。

    1
    2
    3
    4
    5
    6
    7
    create table 临时表 as select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;
    delete from 表名 a
    where a.rowid !=
    (select b.dataid from 临时表 b
    where a.字段1 = b.字段1 and
    a.字段2 = b.字段2 );
    commit;

    对于完全重复记录的删除

    对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:

    1
    select distinct * from 表名

    可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:

    1
    2
    3
    4
    CREATE TABLE 临时表 AS (select distinct * from 表名);
     truncate table 正式表;
    insert into 正式表 (select * from 临时表);
    drop table 临时表;

    如果想删除一个表的重复数据,可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从临时表将数据导入正式表中,如下:

    1
    2
    INSERT INTO t_table_bak
    select distinct * from t_table;

    MySQL查询及删除重复记录的方法
    查询及删除重复记录的方法(例子演示)

    1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

    1
    select * from table where tableId in (select tableId from table group by tableId having count(tableId) > 1)

    2、删除表中多余的重复记录,重复记录是根据单个字段(tableId)来判断,只留有rowid最小的记录。

    1
    delete from table where tableId in (select tableId from table group by tableId  having count(tableId) > 1) and rowid not in (select min(rowid) from table group by tableId having count(tableId )>1)

    3、查找表中多余的重复记录(多个字段)

    1
    select * from vitae a where (a.tableId,a.seq) in (select tableId,seq from vitae group by tableId,seq having count(*) > 1)

    4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

    1
    2
    delete from vitae a where (a.tableId,a.seq) in (select tableId,seq from vitae group by tableId,seq having count(*) > 1)
    and rowid not in (select min(rowid) from vitae group by tableId,seq having count(*)>1)

    5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

    1
    select * from vitae a where (a.tableId,a.seq) in (select tableId,seq from vitae group by tableId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by tableId,seq having count(*)>1)

    6、查询出一个表中,某一列的值是相同的SQL:

    比方说

    在A表中存在一个字段“name”,而且不同记录之间的“name”值有可能会相同,

    现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;

    1
    Select Name,Count(*) From A Group By Name Having Count(*) > 1

    如果还查性别也相同大则如下:

    1
    Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1

    oracle查询表中字段里数据是否有重复

    查单个字段:

    1
    SELECT TEST_NAME,COUNT(*) FROM T_TEST GROUP BY TEST_NAME HAVING COUNT(*) > 1

    Oracle查询重复数据并删除,只保留一条记录
     
    1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断

    1
    2
    3
    select
    * from where Id in (select Id from group byId having count(Id) >
    1)

    2、删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录

    1
    2
    3
    4
    DELETE
    from WHERE (id) IN ( SELECT id FROM GROUP BY id HAVING COUNT(id) > 1) AND
    ROWID NOT IN (SELECT MIN(ROWID) FROM GROUP BY id HAVING COUNT(*) >
    1);

    3、查找表中多余的重复记录(多个字段)

    1
    2
    3
    select
    * from 表 a where (a.Id,a.seq) in(select Id,seq from group by Id,seq having
    count(*) > 1)

    4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

    1
    2
    3
    4
    delete
    from 表 a where (a.Id,a.seq) in (select Id,seq from group by Id,seq having
    count(*) > 1) and rowid not in (select min(rowid) from group by Id,seq
    having count(*)>1)

    5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

    1
    2
    3
    4
    select
    * from 表 a where (a.Id,a.seq) in (select Id,seq from group by Id,seq having
    count(*) > 1) and rowid not in (select min(rowid) from group by Id,seq
    having count(*)>1)

    比如现在有一人员表 (表名:peosons)
    若想将姓名、身份证号、住址这三个字段完全相同的记录查询出来

    1
    2
    3
    4
    5
    select p1.*
    from persons p1,persons p2
    where p1.id<>p2.id
    and p1.cardid = p2.cardid and p1.pname = p2.pname and
    p1.address = p2.address

    可以实现上述效果。
    几个删除重复记录的SQL语句
    1.用rowid方法
    2.用group by方法
    3.用distinct方法
     
    1。用rowid方法
    据据oracle带的rowid属性,进行判断,是否存在重复,语句如下:
    查数据:

    1
    2
    select * from table1 a where rowid !=(select max(rowid)
    from table1 b where a.name1=b.name1 and a.name2=b.name2……)

    删数据:

    1
    2
    delete from table1 a where rowid !=(select max(rowid)
    from table1 b where a.name1=b.name1 and a.name2=b.name2……)

    2.group by方法
    查数据:
    select count(num), max(name) from student
    --列出重复的记录数,并列出他的name属性
    group by num
    having count(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次
    删数据:

    1
    2
    3
    delete from student
    group by num
    having count(num) >1

    这样的话就把所有重复的都删除了。
     
    3.用distinct方法 -对于小的表比较有用

    1
    2
    3
    4
    create table table_new as  select distinct from table1
    minux
    truncate table table1;
    insert into table1 select * from table_new;

    查询及删除重复记录的方法大全
    1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

    1
    2
    3
    select * from people
    where peopleId in select peopleId from people group by
    peopleId having count(peopleId) > 1)

    2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录

    1
    2
    3
    4
    5
    6
    delete from people
    where peopleId in select peopleId from people group by
    peopleId
    having count(peopleId) > 1)
    and rowid not in select min(rowid) from people group by
    peopleId having count(peopleId )>1)

    3、查找表中多余的重复记录(多个字段)

    1
    2
    3
    select * from vitae a
    where (a.peopleId,a.seq) in select peopleId,seq from vitae
    group by peopleId,seq having count(*) > 1)

    4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

    1
    2
    3
    4
    5
    delete from vitae a
    where (a.peopleId,a.seq) in select peopleId,seq from vitae
    group by peopleId,seq having count(*) > 1)
    and rowid not in select min(rowid) from vitae group by
    peopleId,seq having count(*)>1)

    5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

    1
    2
    3
    4
    5
    select * from vitae a
    where (a.peopleId,a.seq) in select peopleId,seq from vitae
    group by peopleId,seq having count(*) > 1)
    and rowid not in select min(rowid) from vitae group by
    peopleId,seq having count(*)>1)

    (二)
    比方说
    在A表中存在一个字段“name”,
    而且不同记录之间的“name”值有可能会相同,
    现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;

    1
    2
    Select Name,Count(*) From A Group By Name Having Count(*) >
    1

    如果还查性别也相同大则如下:

    1
    2
    Select Name,***,Count(*) From A Group By Name,*** Having
    Count(*) > 1

    (三)
    方法一

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    declare @max integer,@id integer
    declare cur_rows cursor local for select 主字段,count(*) from 表名
    group by 主字段 having count(*) >; 1
    open cur_rows
    fetch cur_rows into @id,@max
    while @@fetch_status=0
    begin
    select @max = @max -1
    set rowcount @max
    delete from 表名 where 主字段 = @id
    fetch cur_rows into @id,@max
    end
    close cur_rows
    set rowcount 0

    方法二
    "重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,
    比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
    1、对于第一种重复,比较容易解决,使用
    select distinct * from tableName就可以得到无重复记录的结果集。
    如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

    1
    2
    3
    4
    select distinct * into #Tmp from tableName
    drop table tableName
    select * into tableName from #Tmp
    drop table #Tmp

    发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
     
    2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
    假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

    1
    2
    3
    4
    5
    6
    select identity(int,1,1) as autoID, * into #Tmp from
    tableName
    select min(autoID) as autoID into #Tmp2 from #Tmp group by
    Name,autoID
    select * from #Tmp where autoID inselect autoID from
    #tmp2)

    最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
     
    (四)查询重复

    1
    2
    3
    4
    5
    select * from tablename where id in
    select id from tablename
    group by id
    having count(id) > 1

    原文链接:http://www.cnblogs.com/qmfsun/p/4871776.html

    展开全文
  • 数据表迁移的几个简单操作

    千次阅读 2018-12-03 13:51:13
    一张表数据全部插入另一张表; 1.如果2张表的字段一致,并且希望插入全部数据可以用这种方法: INSERT INTO 目标 as SELECT * FROM 来源;  insert into insertTest as select * from insertTest2; 2....
  • mysql给数据量大的添加索引的办法

    千次阅读 2020-04-07 22:48:26
    有一问题,一张表有3百万条记录,随着时间的增加,记录量会更多,此时查询速度很慢。在创建此前没有未相应字段添加索引,所以此时需要为添加索引。但是因为数据量大的原因,索引添加不成功,想了很多办法,...
  • MySQL的几个概念:主键,外键,索引,唯一索引主键(primary key) 能够唯一标识中某一行的属性或属性组。一个只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不一致。...
  • 2、数据量超过300的应该有索引; 3、经常与其他进行连接的,在连接字段上应该建立索引; 4、经常出现在Where子句中的字段,特别是大的字段,应该建立索引; 5、索引应该建在选择性高的字段上; 6、索引应该...
  • MySQL百万级数据添加索引

    千次阅读 2019-01-07 19:52:14
    直接alter table add index 添加索引,执行一小时没反应,并且会导致锁;故放弃该办法,最终解决办法如下: 解决方案 导出原表数据 创建新与原结构保持一致,在该上执行alter语句添加索引; 将表数据...
  • 有一问题,一张表有3百万条记录,随着时间的增加,记录量会更多,此时查询速度很慢。在创建此前没有未相应字段添加索引,所以此时需要为添加索引。但是因为数据量大的原因,索引添加不成功,想了很多办法,...
  • 什么情况下应该建立索引 ...ORACLE利用索引来保证数据的完整性 如lc_hj(流程环节)中的lc_bh+hj_sx(流程编号+环节顺序) 直接条件查询的字段 在SQL中用于条件约束的字段 如zl_yhjbqk(用户基本情况)中的qc
  • mysql一个表可以创建多唯一索引

    千次阅读 2018-09-06 11:44:00
    如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一 唯一索引 。 转载于:https://my.oschina.net/zjllovecode/blog/1973479
  • 堆组织就不说了,其索引中记录了记录所在位置的rowid,查找的时候先找索引,然后再根据索引rowid找到块中的行数据 索引组织,其行数据索引形式存放,因此找到索引,就等于找到了行数据。 -- 堆组织的...
  • Lucene倒排索引简述 之索引表

    千次阅读 2018-09-27 09:57:42
    Lucene倒排索引的核心内容,索引表,你对这部分真的熟悉了吗?那你知道FST用什么地方吗?FST又存储了什么内容呢?有什么功能呢?关于Burst-Trie,你知道Lucene是如何采用它的思想来加速Lucene搜索性能的吗?
  • MySQL创建数据表索引

    千次阅读 2011-08-10 17:10:16
    show databases; //查看数据库 create database test; //创建数据库 use test; //选择数据库 \s //查看数据库状态 ? create table; //创建的帮助 show
  • 表数据量与索引性能的关系 特别说明: 生产环境中的row_id为应用程序生成,无明显生成规则,因此使用row_id建立分区可行度不高; 实验结论: 一、各查询执行计划路线都相同,但cost、consistent gets、...
  • mysql千万级数据量根据索引优化查询速度

    万次阅读 多人点赞 2016-08-15 18:05:16
    索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要十秒甚至更多,5秒以上就已经让人难以忍受了。...
  • 最近这天在课设的过程中,遇到了一问题。 简单来说,我现在有两张数据表一张是enployee,员工的信息;一张是user可以登录用户的信息。之间通过 emp_no关联。两张对应的sql代码: user: INSERT ...
  • 索引表简介

    万次阅读 2012-04-12 23:52:45
    首先,如果没有索引,当你想要去查找某个值的时候,你不得不对数据进行顺序扫描,如果一张表有n行,那么使用顺序扫描的平均扫描行数为n/2,一旦的行数越来越多,这种顺序扫描的效率将大幅下降;如果有索引的参与,...
  • 一、可以创建多个索引嘛? 可以创建多个索引的。 需要开发人员根据实际的用途以及数据库中记录的情况,来进行判断。 通常来说,的索引越多,其查询的速度也就越快。但是,的insert/update速度则会降低。这主要是...
  • 海量数据处理之数据库索引

    千次阅读 2016-06-06 13:47:54
    前言:本文第一部分讨论数据库的索引及其优化,主要以sql server为例,第二部分我们从Mysql讨论它背后的数据结构和算法原理。 第一部分,数据库索引及其优化 一,什么是索引  数据库索引好比是一本书前面...
  • 关于postgresql同一中的同一列可以填加多相同索引的问题 首先我们建一张表 postgres=# create table test (id int ,name text,num numeric); CREATE TABLE 插入数据 postgres=# insert into test values (( ...
  • 什么是索引?Mysql目前主要的索引类型

    万次阅读 多人点赞 2018-02-27 10:11:16
    一、索引MySQL索引的建立对于MySQL的高效运行是很...单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。创建索引时,你需要确保该索引是应用在 SQ...
  •  前言  最近在一次面试中,讨论了一这样的问题:主键和索引有什么区别?当时我的回答是这样的:“主键就是加了唯一性约束的聚集索引。... 首先,必须了解一些基本知识:对于一张表来说,聚集索
  • HBase 索引表结构

    千次阅读 2017-12-26 14:08:20
    1. 索引的结构在HBase中,表格的Rowkey按照字典排序,Region按照RowKey设置split point进行shard,通过这种方式实现的全局、分布式索引,成为了其成功的最大的砝码每一个索引建立一个,然后依靠的row key来...
  • 影响数据检索效率的几个因素

    千次阅读 2015-06-09 19:32:44
    数据检索有两种主要形态。第一种是纯数据库型的。...典型的结构是有一分区的数据存储,最初这种存储就是原始的 HDFS,后来开逐步有人在 HDFS 上加上索引的支持,或者干脆用 Elasticsearc 这样的数据存储。
  • Mysql索引类型的区别及适用情况

    万次阅读 多人点赞 2013-07-30 18:39:38
    如大家所知道的,Mysql目前主要有以下索引类型:FULLTEXT,HASH,BTREE,RTREE...其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。值得一提的
  • Mysql目前主要的索引类型

    千次阅读 热门讨论 2019-04-23 14:57:50
    索引的作用就类似于书本的目录,新华字典的拼音,偏旁部首的首查字,可以快速的检索到需要的内容,所以当数据达到百万的时候,那么索引就很有必要了。 索引优点: 1.大大加快数据的检索速度; 2.创建唯一性索引.....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 106,956
精华内容 42,782
关键字:

一张数据表可以设置几个索引