精华内容
下载资源
问答
  • 索引建立

    2019-01-29 14:05:44
    索引是系统内部自动维护隐藏“数据表”,它作用是,可以极大地加快数据查找速度!这个隐藏数据表,其中数据是自动排好序,其查找速度...含义: 是一个索引,而且还可以设定其字段的值不能重复(唯一性...

    索引是系统内部自动维护的隐藏的“数据表”,它的作用是,可以极大地加快数据的查找速度!这个隐藏的数据表,其中的数据是自动排好序的,其查找速度就是建立在这个基础上。
    索引类型有如下几个:
    普通索引: 形式: key(字段名)
    含义: 就是一个索引而已,没有其他作用,只能加快查找速度;
    唯一索引: 形式: unique key(字段名)
    含义: 是一个索引,而且还可以设定其字段的值不能重复(唯一性);
    主键索引: 形式: primary key (字段名)
    含义: 是一个索引,而且,还具有区分该表中的任何一行数据的作用(其实也是唯一性)
    它其实比唯一性索引多一点功能:唯一性可以为空null,而主键不能为空;
    全文索引: 形式: fulltext (字段名)。
    外键索引: 形式: foreign key (字段名) references 其他表(对应其他表中的字段名);
    在这里插入图片描述
    此时,该表中如果以id,user_name,或email做条件进行查找,就会“很快”,而以age做条件就会“很慢”。
    外键索引:
    形式: foreign key (字段名) references 其他表(对应其他表中的字段名);
    什么叫外键?
    外键,就是指,设定的某个表(tab1)某个字段(f1),它的数据的值,必须是在另一个表(tab2)中的某个字段(f2)中存在!
    在这里插入图片描述
    在这里插入图片描述
    此时,插入xuesheng表中的数据时,banji_id字段的值,就不可以随便插入了,而是必须是banji表中的id字段所已经有的数据值,才可以插入

    展开全文
  • 场景 ...假设字段k上的值不重复 查询过程 1、查询语句:SELECT id FROM T WHERE k=5 2、查询过程 通过B+树从树根开始,按层搜索到叶子节点,即上图中右下角数据页 在数据页内部通过二分法
  • 索引优化

    2018-03-16 14:54:00
    普通唯一索引:单个字段建立唯一索引,需要此字段所在列上不能有重复的值,属于二级索引。复合唯一索引:多个字段上联合建立唯一索引,属于二级索引。 聚集索引 表数据按照索引的顺序来存储。对于聚集索引,...

    唯一索引

    主键就是唯一索引,但是唯一索引不一定是主键,唯一索引可以为空,但是空值只能有一个,主键不能为空。
    普通唯一索引:单个字段上建立唯一索引,需要此字段所在的列上不能有重复的值,属于二级索引。
    复合唯一索引:多个字段上联合建立唯一索引,属于二级索引。

    聚集索引

    表数据按照索引的顺序来存储的。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。

    在一张表上只能创建一个聚集索引,因为真实数据的物理顺序只可能是一种。如果一张表没有聚集索引,那么它被称为“堆集”(Heap)。这样的表中的数据行没有特定的顺序,所有的新行将被添加到表的末尾位置。

    非聚集索引

    表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,该层紧邻数据页,其行数量与数据表行数据量一致。 

    建索引的几大原则

    1. 最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

    2. =和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。

    3. 尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录。

    4. 索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);

    5. 尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。

    6. 查询只能使用索引的最左前缀,直到遇到第一个范围条件列。尽可能将需要做范围查询的列放到索引的后面,以便优化器能使用尽可能多的索引列。

    7. 创建索引时,如果将sex列作为前缀,如果某个查询不限制性别,那么可以通过在查询条件中新增AND SEX IN('m','f')来让MySQL选择该索引。这样写并不会过滤任何行,和没有这个条件时返回的结果相同。但是必须加上这个列的条件,MySQL才能够匹配索引的最左前缀。这个“诀窍”在这类场景中非常有效,但如果列有太多不同的值,就会让IN()列表太长,这样做就不行了。

    案例

    1 优化排序

    使用文件排序对小数据集是很快的,但如果一个查询匹配的结果有上百万行的话会怎样?例如如果WHERE子句只有sex列,如何排序?
    对于那些选择性非常低的列,可以增加一些特殊的索引来做排序。例如,可以创建(sex, rating)索引用于下面的查询:

    SELECT <cols> FROM profiles WHERE sex='M' ORDER BY rating LIMIT 10;

    这个查询同时使用了ORDER BY和LIMIT,如果没有索引的话会很慢。
    即使有索引,如果用户界面上需要翻页,并且翻页到比较靠后时查询也可能非常慢。下面这个查询就通过ORDER BY和LIMIT偏移量的组合翻页到很后面的时候:

    SELECT <cols> FROM profiles WHERE sex='M' ORDER BY rating LIMIT 100000,10;

    无论如何创建索引,这种查询都是个严重的问题。因为随着偏移量的增加,MySQL需要花费大量的时间来扫描需要丢弃的数据。优化这类索引的另一个比较好的策略是使用延迟关联,通过使用覆盖索引查询返回需要的主键,再根据这些主键关联原表获得需要的行。这可以减少MySQL扫描那些需要丢弃的行数。下面这个查询显示了如何高效地使用(sex,rating)索引进行排序和分页:

    SELECT <cols> FROM profiles INNER JOIN (
    SELECT <primary key cols> FROM profiles 
    where x.sex='M' ORDER BY rating LIMIT 100000,10
    )AS x USING(<primary key cols>);

    2. 以%开头的LIKE查询不能够利用B-tree索引

    explain select * from actor where last_name like '%NI%'

    解决办法

    先扫描索引 last_name获取满足条件的%NI%的主键actor_id列表,之后根据主键回表去检索记录,这样访问避开了全表扫描actor表产生的大量IO请求。

    explain select * from (select actor_id from actor where last_name like '%NI%') a,actor b where a.actor_id = b.actor_id; 

    慢查询优化基本步骤

    0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE
    1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高
    2.explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)
    3.order by limit 形式的sql语句让排序的表优先查
    4.了解业务方使用场景
    5.加索引时参照建索引的几大原则
    6.观察结果,不符合预期继续从0分析

    查询优化神器 - explain命令

    关于explain命令相信大家并不陌生,具体用法和字段含义可以参考官网explain-output,这里需要强调rows是核心指标,绝大部分rows小的语句执行一定很快(有例外,下面会讲到)。所以优化语句基本上都是在优化rows。

     参考资料

    索引的一些总结:http://www.cnblogs.com/rush/archive/2012/04/22/2465683.html

    MySQL索引原理及慢查询优化:https://tech.meituan.com/mysql-index.html

    数据库-索引(概念,优缺点,分类):http://blog.csdn.net/zdplife/article/details/48033919

    转载于:https://www.cnblogs.com/junzi2099/p/8340303.html

    展开全文
  • 唯一标识一条记录,不能有重复的,不允许为空 表外键是另一表主键,外键可以有重复的,可以是空值 该字段没有重复值,但可以有一个空值 作用: 用来保证数据完整性...

    主键、外键和索引的区别?

     

    主键

    外键

    索引

    定义:

    唯一标识一条记录,不能有重复的,不允许为空

    表的外键是另一表的主键, 外键可以有重复的, 可以是空值

    该字段没有重复值,但可以有一个空值

    作用:

    用来保证数据完整性

    用来和其他表建立联系用的

    是提高查询排序的速度

    个数:

    主键只能有一个

    一个表可以有多个外键

    一个表可以有多个惟一索引

    展开全文
  • 唯一标识一条记录,不能有重复的,不允许为空 表外键是另一表主键,外键可以有重复的,可以是空值 该字段没有重复值,但可以有一个空值 作用: 用来保证数据完整性...

     

     

    主键

    外键

    索引

    定义:

    唯一标识一条记录,不能有重复的,不允许为空

    表的外键是另一表的主键, 外键可以有重复的, 可以是空值

    该字段没有重复值,但可以有一个空值

    作用:

    用来保证数据完整性

    用来和其他表建立联系用的

    是提高查询排序的速度

    个数:

    主键只能有一个

    一个表可以有多个外键

    一个表可以有多个惟一索引

     

    展开全文
  • 主键–唯一标识一条记录,不能有重复的,不允许为空 外键–表外键是另一表主键, 外键可以有重复的, 可以是空值 索引–该字段没有重复值,但可以有一个空值 作用: 主键–用来保证数据完整性 外键–用来和...
  • 主键--唯一标识一条记录,不能有重复的,不允许为空 外键--表外键是另一表主键, 外键可以有重复的, 可以是空值 索引--该字段没有重复值,但可以有一个空值 作用: 主键--用来保证数据完整性 外键--用来和...
  • 主键–唯一标识一条记录,不能有重复的,不允许为空 外键–表外键是另一表主键, 外键可以有重复的, 可以是空值 索引–该字段没有重复值,但可以有一个空值 作用: 主键–用来保证数据完整性 外键–用来和其他表...
  • 关系型数据库索引类型

    千次阅读 2016-09-18 21:46:45
    1.主索引:主索引是一种只能在数据库表中建立不能在自由表中建立索引。在指定的字段或表达式中,主索 引的关键字绝对不允许有重复值。 2.候选索引:和主索引类似,它的值也 不允许在指定的字段或表达式中重复。一...
  • 定义主键--唯一标识一条记录,不能有重复的,不允许为空外键--表外键是另一表主键, 外键可以有重复的, 可以是空值索引--该字段没有重复值,但可以有一个空值 作用主键--用来保证数据完整性外键--用来和其他表...
  • 索引使用策略及优化

    2018-07-01 16:40:03
    索引字段重复不能过多,如果某个字段为主键,那么这个字段不用设为索引。在过滤性高的字段上加索引。使用索引注意事项使用like关键字时,前置%会导致索引失效。使用null会被自动从索引中排除,索引一般不会建立在...
  • oracle主键和索引

    2019-04-24 09:42:00
    主键:能够唯一标识一条记录的字段为主键(亦或主码),不能重复的,不允许为空。作用:用来保证数据完整性个数:主键只能一个索引:作用:是提高查询排序的速度个数:一个表可以多个索引常用索引类型:Non-...
  • 索引和主键

    2011-09-08 10:12:47
    索引和主键都是索引,建主键和唯一...主健不能有重复值索引可以有重复值索引和主键都是索引 建主键时候也就建立了聚集索引(之后排序不再维护) 主键的索引是SQL中唯一性索引 即每更新/新增主键字段会检测一
  • 唯一标识一条记录,不能有重复的,不允许为空 表外键是另一表主键, 外键可以有重复的, 可以是空值 该字段没有重复值,但可以有一个空值 作用 用来保证数据完整性 用来和其他表建立联系用 ...
  • 而在这个沟通过程中,就需要表中一个字段作为标志,不同的记录对应的字段取值不能相同,也不能是空白的。通过这个字段中不同的可以区别各条记录。就像我们区别不同的人,每个人都名字,但它却不能作为主键,...
  • 数据库主键、外键和索引理解

    千次阅读 2018-09-14 07:12:18
    唯一标识一条记录,不能有重复的,不允许为空 表外键是另一表主键, 外键可以有重复的, 可以是空值 该字段没有重复值,但可以有一个空值 作用: 用来保证数据完整性 用来和其他表建立联系用 ...
  • 而在这个沟通过程中,就需要表中一个字段作为标志,不同的记录对应的字段取值不能相同,也不能是空白的。通过这个字段中不同的可以区别各条记录。就像我们区别不同的人,每个人都名字,但它却不能作为主键,...
  • 而在这个沟通过程中,就需要表中一个字段作为标志,不同的记录对应的字段取值不能相同,也不能是空白的。通过这个字段中不同的可以区别各条记录。就像我们区别不同的人,每个人都名字,但它却不能作为主键,...
  • 在指定的字段或表达式中,主索引的关键字绝对允许有重复值。 ②候选索引:和主索引类似,它的值也允许在指定的字段或表达式中重复。一个表中可以有多个候选索引。 ③唯一索引:唯一索引允许关键字取重复的值。当...
  • 企业面试——数据库

    2018-01-16 11:26:59
    1.主索引:主索引是一种只能在数据库表中建立不能在自由表中建立索引。在指定的字段或表达式中,主索 引的关键字绝对不允许有重复值。 2.候选索引:和主索引类似,它的值也 不允许在指定的字段或表达式中重复。一...
  • 索引:该字段没有重复值,但可以一个空值;一个表可以多个唯一索引索引作用是提高查询排序速度 外键取值规则:空值或参照主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能插入。 (2)更新时...
  • PGP(Pretty Good Privacy)创始人是美国Phil Zimmermann(菲利普•齐默曼),他在1991年把 RSA 公钥体系方便和传统加密体系高速度结合起来,并且在数字签名和密钥认证管理机制上巧妙设计。因此 PGP ...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 138
精华内容 55
关键字:

有重复值的字段不能建立索引