mysql索引理解

mysql中设置数据库的作用:

提高查询速度。索引是指把你设置为索引的字段A的内容储存在一个独立区间S里,里面只有这个字段的内容。在找查这个与这个字段A的内容时会直接从这个独立区间里查找,而不是去到数据表里查找。找到的这些符合条件的字段后再读取字段A所指向真实的数据记录的物理地址,再把对应的数据内容输出。 如果你查找的不是索引的字段那么他会从数据表里面查找。因为数据表有很多不相关的字段,数据库程序是不会省略不查找。要判断那些不相关的字段以及多次在记录中跳转是花费一定的资源的。 当然不是设置越多索引就越好。因为索引都放到这个独立区间S,独立区间S越大搜索所占的资源就越大。如果你只有一个字段为索引,那么你搜索这个字段是非常快速的。



以项例子中用到的数据库表结构如下:

CREATE TABLE `indextest` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `nickname` varchar(32) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


mysql中的四种索引类型:

1.普通索引

这是最基本的索引类型,而且它没有唯一性之类的限制。

创建
alter table indextest add index name_index(name)

2.唯一性索引
在普通索引的基础上,增加了数据的唯一性,索引在字段是唯一约束的时候,添加该索引。

3.主键索引
alter table indextest add primary key name_unique(name)
每个表只能有一个主键,可以创建联合主键

4.全文索引

文本字段上的普通索引只能加快对出现在字段内容最前面的字符串进行的检索操作。如果字段里存放的是由学多个单词构成的大段文字,普通索引就没什么作用“%word%”费时,效率低,响应时间长。生成全文索引时,MySQL将把文中出现的所有单词创建一份清单,查询操作根据这份清单去检索相关数据记录。
但目前全文索引对中文支持很差,需要相关分词插件。(如:http://code.google.com/p/mysqlcft/)


多重索引

创建多列索引就是多重索引了
alter table indextest add index nackname_name_index(name,nickname)
多重索引还有另外一个优点,它通过称为最左前缀(Leftmost Prefixing)的概念体现出来。
例如:创建多重索引firstname、lastname、age列,则查询条件:
firstname,lastname,age
firstname,lastname
firstname
就会用到该索引


sql语句中什么位置会用到索引?

在WHERE子句中出现的列
在join子句中出现的列

MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。
举例:
SELECT
    people.age, ##不使用索引,town.name ##不使用索引
FROM
    people
LEFT JOIN
    town
ON
  people.townid=town.townid ##考虑使用索引
WHERE
    firstname='Mike'##考虑使用索引
AND
    lastname='Sullivan'##考虑使用索引


分析索引:

使用关键字explain,格式explain sql

以上表为例创建多重索引:

alter table indextest add index nackname_name_index(name,age,nickname)

分析sql:

explain select * from indextest where name = "aaa" 

输出结果如下:

table:表名

type:连接

possible_keys:索引利用的可能名称

key:它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。

key_len索引字符的长度

ref它显示的是列的名字(或单词“const”),MySQL将根据这些列来选择行。

rows:MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。


*索引的底层结构是B-二叉树,在搜索的基础上大大提高了效率!


哪些操作将会导致添加的索引失效:

1.where条件后面添加!=条件查询

explain select * from indextest where age != -1

2. 量避免使用 GROUP BY、DISTINCT、OR、IN等语句的使用,避免使用联表查询和子查询,有可能会导致索引创建失效


3.使用like模糊查询时候%,_不能为第一个字符,否则索引会失效


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值