数据库组合索引

索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行,还需要考虑每次读入数据页的IO开销。而如果采取索引,则可以根据索引指向的页以及记录在页中的位置,迅速地读取目标页进而获取目标记录。

大多数情况下都(默认)采用B树来构建索引。只是空间列类型的索引使用R-树,并且MEMORY表还支持hash索引。B树是平衡多叉树,每个节点存放多少个值取决于值所占的空间,这与每一张数据页存放多少条记录与记录信息量有关同理。节点中的值是以非降序进行排列的,节点中的值总是小于等于指向它的结点中的值。

MySQL使用B树构造索引的情况下,是由叶子指向具体的页和记录的。并且一个叶子有一个指针指向下一个叶子。

使用索引需要注意:

⑴只对WHERE和ORDER BY需要查询的字段设置索引,避免无意义的硬盘开销;

⑵组合索引支持前缀索引;

⑶更新表的时候,如增删记录,MySQL会自动更新索引,保持树的平衡;因此更多的索引意味着更多的维护成本

 索引的字段类型问题

  • text类型,也可建索引(需指定长度)
  • myisam存储引擎索引键长度综合不能超过1000字节
  • 用来筛选的值尽量保持和索引列同样的数据类型

索引分四类:

index ----普通的索引,数据可以重复

fulltext----全文索引,用来对大表的文本域(char,varchar,text)进行索引。语法和普通索引一样。 

unique ----唯一索引,唯一索引,要求所有记录都唯一

primary key ----主键索引,也就是在唯一索引的基础上相应的列必须为主键

like 不能用索引?

  • 尽量减少like,但不是绝对不可用,”xxxx%” 是可以用到索引的,

想象一下,你在看一本成语词典,目录是按成语拼音顺序建立,查询需求是,你想找以 “一”字开头的成语(”一%“),和你想找包含一字的成语(“%一%”)

  • 除了like,以下操作符也可用到索引:

<,<=,=,>,>=,BETWEEN,IN

<>,not in ,!=则不行

 

原则

   1,单表数据太少,索引反而会影响速度;更新非常频繁的数据不适宜建索引

   2,where后的条件,order by ,group by 等这样过滤时,后面的字段最好加上索引。根据实际情况,选择PRIMARY KEY、UNIQUE、INDEX等索引,但是不是越多越好,要适度

    3,联合查询,子查询等多表操作时关连字段要加索引

ps:数据量特别大的时候,最好不要用联合查询,即使你做了索引

多列查询该如何建索引?

一次查询只能用到一个索引,所以 首先枪毙 a,b各建索引方案

a还是b? 谁的区分度更高(同值的最少),建谁!

当然,联合索引也是个不错的方案,ab,还是ba,则同上,区分度高者,在前

联合索引的问题?

where a = “xxx” 可以使用 AB 联合索引
where b = “xxx” 则不可 (再想象一下,这是书的目录?)

所以,大多数情况下,有AB索引了,就可以不用在去建一个A索引了

详解:

联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。


两个或更多个列上的索引被称作复合索引。
利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。
所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。
如:建立 姓名、年龄、性别的复合索引。
 

create table test(
a int,
b int,
c int,
KEY a(a,b,c)
);

优: select * from test where a=10 and b>50
差: select * from test where a50

优: select * from test order by a
差: select * from test order by b
差: select * from test order by c

优: select * from test where a=10 order by a
优: select * from test where a=10 order by b
差: select * from test where a=10 order by c

优: select * from test where a>10 order by a
差: select * from test where a>10 order by b
差: select * from test where a>10 order by c

优: select * from test where a=10 and b=10 order by a
优: select * from test where a=10 and b=10 order by b
优: select * from test where a=10 and b=10 order by c

优: select * from test where a=10 and b=10 order by a
优: select * from test where a=10 and b>10 order by b
差: select * from test where a=10 and b>10 order by c


 

mysql 复合索引,联合索引 - flyflying1987 - ly

索引原则

1.索引越少越好
原因:主要在修改数据时,第个索引都要进行更新,降低写速度。
2.最窄的字段放在键的左边
3.避免file sort排序,临时表和表扫描.

哪些常见情况不能用索引?

  • like “%xxx”
  • not in , !=
  • 对列进行函数运算的情况(如 where md5(password) = “xxxx”)
  • WHERE index=1 OR A=10
  • 存了数值的字符串类型字段(如手机号),查询时记得不要丢掉值的引号,否则无法用到该字段相关索引,反之则没关系

也即

select * from test where mobile = 13711112222;

可是无法用到mobile字段的索引的哦(如果mobile是char 或 varchar类型的话)

btw,千万不要尝试用int来存手机号(为什么?自己想!要不自己试试)

 

覆盖索引(Covering Indexes)拥有更高效率

索引包含了所需的全部值的话,就只select 他们,换言之,只select 需要用到的字段,如无必要,可尽量避免select *

NULL 的问题

NULL会导致索引形同虚设,所以在设计表结构时应避免NULL 的存在(用其他方式表达你想表达的NULL,比如 -1?

### 数据库组合索引的使用方法与优化技巧 #### 1. 组合索引的概念 组合索引是指在一个表的多个字段上建立的一个索引。它允许数据库引擎按照指定顺序对这些字段进行联合查找,从而提高查询效率[^1]。 #### 2. 创建组合索引的方法 在大多数关系型数据库中(如 MySQL 和 PostgreSQL),可以通过 `CREATE INDEX` 或者定义表时直接设置的方式创建组合索引。以下是 MySQL 中创建组合索引的示例: ```sql -- 假设有一个名为 users 的表,包含 id, name, age 字段 CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(100), age INT ); -- 创建一个基于 (name, age) 的组合索引 CREATE INDEX idx_name_age ON users(name, age); ``` 此语句会在 `users` 表上的 `(name, age)` 列组合上创建一个索引[^1]。 #### 3. 查询条件中的覆盖范围 当查询涉及组合索引的第一个字段或者前几个字段时,该索引会被有效利用。例如,在上面的例子中,如果查询只涉及到 `name` 或同时涉及 `name` 和 `age`,则会触发索引加速;但如果仅针对 `age` 进行过滤,则不会命中这个组合索引。 #### 4. 组合索引的设计原则 - **最左匹配原则**:组合索引遵循“最左前缀”的规则,即只有查询条件包含了索引的第一部分才能被使用。因此,在设计组合索引时应优先考虑那些经常作为筛选条件使用的列放在前面。 - **高区分度优先**:对于频繁参与查询且具有较高唯一性的字段应该放置于较靠前的位置,这样可以更快缩小搜索空间[^2]。 - **避免冗余索引**:如果有单字段索引已经存在,并且其作用能够完全由新的多字段组合索引替代,则可删除前者以减少维护成本并节省存储资源[^2]。 #### 5. 性能调优建议 为了进一步发挥组合索引的优势,还需要注意以下几点: - 定期分析和调整现有索引配置,确保它们仍然适应当前的工作负载变化情况; - 对大容量的数据集操作之前先评估可能产生的锁竞争影响; - 如果发现某些特定场景下即使应用了合适类型的索引仍无法达到预期效果,则需重新审视整个逻辑架构是否存在瓶颈点[^2]。 --- ### 示例代码展示如何验证组合索引的效果 下面是一个简单的测试脚本,用来演示如何通过 EXPLAIN 来查看 SQL 执行计划是否正确利用到了我们所建好的组合索引: ```sql EXPLAIN SELECT * FROM users WHERE name='John' AND age=30; ``` 运行以上命令后可以从返回的结果集中观察到 key 字段显示为刚才新建的那个复合键名(idx_name_age),这表明此次检索确实走的是我们的定制化路径而不是全表扫描方式完成读取动作。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值