加入收藏 | 设为首页 | 会员中心 | 我要投稿 航空爱好网 (https://www.52kongjun.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

MySql索引使用策略分析

发布时间:2022-12-16 13:22:56 所属栏目:MsSql教程 来源:
导读:  MySql索引

  索引优点

  1.可以通过建立唯一索引或者主键索引,保证数据的唯一性.

  2.提高检索的数据性能

  3.在表连接的连接条件 可以加速表与表直接的相连

  4.建立索引,在查询
  MySql索引
 
  索引优点
 
  1.可以通过建立唯一索引或者主键索引,保证数据的唯一性.
 
  2.提高检索的数据性能
 
  3.在表连接的连接条件 可以加速表与表直接的相连
 
  4.建立索引,在查询中使用索引 可以提高性能
 
  索引缺点
 
  1.在创建索引和维护索引 会耗费时间,随着数据量的增加而增加
 
  2.索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间
 
  3.当对表的数据进行 INSERT,UPDATE,DELETE 的时候,索引也要动态的维护,这样就会降低数据的维护速度,
 
  (建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快)。
 
  使用索引需要注意的地方
 
  1.在经常需要搜索的列上,可以加快索引的速度
 
  2.主键列上可以确保列的唯一性
 
  3.在表与表的而连接条件上加上索引,可以加快连接查询的速度
 
  4.在经常需要排序(order by),分组(group by)和的distinct 列上加索引 可以加快排序查询的时间, (单独order by用不了索引,索引考虑加where或加limit)
 
  5.在一些where 之后的 < >= BETWEEN IN 以及某个情况下的like 建立字段的索引(B-TREE)
 
  6.like语句的 如果你对nickname字段建立了一个索引.当查询的时候的语句是 nickname lick ’%ABC%’ 那么这个索引讲不会起到作用.而nickname lick ’ABC%’ 那么将可以用到索引
 
  7.索引不会包含NULL列,如果列中包含NULL值都将不会被包含在索引中,复合索引中如果有一列含有NULL值那么这个组合索引都将失效,一般需要给默认值0或者 ’ ’字符串
 
  8.使用短索引,如果你的一个字段是Char(32)或者int(32),在创建索引的时候指定前缀长度 比如前10个字符 (前提是多数值是唯一的..)那么短索引可以提高查询速度,并且可以减少磁盘的空间,也可以减少I/0操作.
 
  9.不要在列上进行运算,这样会使得mysql索引失效,也会进行全表扫描
 
  10.选择越小的数据类型越好,因为通常越小的数据类型通常在磁盘,内存,cpu,缓存中 占用的空间很少,处理起来更快
 
  什么情况下不创建索引
 
  1.查询中很少使用到的列 不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求.
 
  2.很少数据的列也不应该建立索引,比如 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率
 
  3.定义为text和image和bit数据类型的列不应该增加索引,
 
  4.当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系
 
  以上就是MySql索引使用策略分析的详细内容,更多关于MySQL 索引的资料请关注其它相关文章!
 
  关于MySQL复合索引的使用方法
 
  MySQL的复合索引可以创建多个,每个复合索引可以包含一列或多列。复合索引使用的基本原则是左侧对齐原则。
 
  如何理解并正确使用MySql索引
 
  MySQL索引类型包括:(1)普通索引这是最基本的索引,它没有任何限制。它有以下几种创建方式:◆创建索引CREATE INDEX indexName ON mytable(username(length)); 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。
 
  如果是组合索引,则列值的组合必须唯一。
 
  mysql–索引优化
 
  索引覆盖是指如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再找数据。这种查询速度非常快,称为”索引覆盖” 1查询频繁2区分度高3长度小4尽量能覆盖常用查询字段 索引长度直接影响索引文件的大小,影响增删改的速度,并间接影响查询速度(占用内存多)。
 
  但是: 1:截的越短, 重复度越高,区分度越小, 索引效果越不好 2:截的越长, 重复度越低,区分度越高, 索引效果越好,但带来的影响也越大–增删改变慢,并间影响查询速度. 所以,我们要在 区分度 + 长度 两者上,取得一个平衡( distinct去重 ) select count (distinctleft (word,6)) / count (*) from tablename; 对于一般的系统应用区别度能达到 0.1 ,索引的性能就可以接受. alter table tablename add index word(word(4)); 给字符串类型的字段建立索引效率不高,但是必须要经常查这个字段怎么建索引? 比如说一个字段url,类型是字符串。那么可以建一个字段 crcurl 来存储url字段crc32后的值,并给 crcurl 建立索引。 crc32:循环冗余校验。根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。
 
  生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。 crc32 是整形,在MySQL中,给整形字段建立索引效率比较高,crc32虽然不能确保唯一性,但是无碍,相同的机率也是极小,关键是可以大大减少查询的范围mssql 索引,给crcurl这个字段建立索引,查询的时候带上crcurl字段就可以利用到索引。
 
  不允许翻过100页(百度搜索一般到70页左右) 首先我们直接大数据分页limit 5000000,10 发现耗时4.41秒 接下来我们转换方式使用where条件查询,只耗时0.02秒 2次的查询结果不一致,这是因为数据被物理删除过有空洞.,因此我们可以追加软删除功能 分析:优化思路是 不查,少查,查索引,少取. 我们现在必须要查,则只查索引,不查数据,得到id. 再用id去查具体条目. 这种技巧就是延迟索引. 分析:limit是先查询再越过,也就是说我们先查询出所有数据再进行跳跃,上图我们越过500W页,还使用了innerjoin 内存并没有崩掉,这是因为我们子句tmp临时表中只查询了id(索引覆盖,不需要回行去磁盘找数据了)然后拿到这10个id分别查询这10条数据 。 排序可能发生2种情况: 1:对于覆盖索引,直接在索引上查询时,就是有顺序的, using index 2:先取出数据,形成临时表做filesort(文件排序,但文件可能在磁盘上,也可能在内存中) 我们的争取目标:取出来的数据本身就是有序的! 利用索引来排序,那么什么时候发生索引排序呢?即查询索引和order by的字段是同一个字段 goods表中 cat_id与shop_price组成联合索引: select goods_id,cat_id,shop_price from goods where cat_id=4 order by shop_price;可以直接利用索引来排序, using where按照shop_price索引取出的结果,本身就是有序的 select goods_id,cat_id,shop_price from goods order by click_count; using filesort用到了文件排序,即取出的结果再次排序 重复索引是指 在同1个列(如age), 或者顺序相同的几个列(age,school), 建立了多个索引,称为重复索引,重复索引没有任何帮助,只会增大索引文件,拖慢更新速度。 冗余索引是指2个索引所覆盖的列有重叠, 称为冗余索引。
 

(编辑:航空爱好网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!