linux怎么查看本机内存大小
261
2022-09-24
MySQL 中的索引解析
一 索引概述
1.索引的优点
为什么要创建索引?这是因为,创建索引可以大大提高系统的查询性能。 如果不使用索引,查询时从第一行开始查询。如果使用了索引就可以更加快速的找到希望的数据第一、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二、可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。第三、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五、通过使用索引,可以在查询的过程中,使用查询优化器,提高系统的性能。
2.索引的缺点
也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点, 但是,为表中的每一个列都增加索引,是非常不明智的。 这是因为,增加索引也有许多不利的一个方面:第一、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大。第三、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
二 索引选择
1.什么样的字段适合创建索引
索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。 一般来说,应该在具备下述特性的列上创建索引:第一、在经常需要搜索的列上,可以加快搜索的速度;第二、在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;第三、在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;第四、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;第五、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;第六、在经常使用在 WHERE 子句中的列上面创建索引,加快条件的判断速度。建立索引,一般按照 select 的 where 条件来建立,比如: select 的条件是 where f1 andf2,那么如果我们在字段 f1 或字段 f2 上建立索引是没有用的,只有在字段 f1 和 f2 上同时建立索引才有用等
2.什么样的字段不适合创建索引
同样,对于有些列不应该创建索引。一般来说,不应该创建索引的这些列具有下述特点:第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。第三,对于那些定义为 text, image 和 bit 数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
三 MySQL 中的索引类型
1.单列索引
就是给一个列添加索引。 普通索引:不考虑过多情况,主要是为了让查询更快一些。 唯一索引:列中值不可以重复,可以是 null 主键索引:列中值不可以重复,又不可以为 null
2.组合索引
给表中大于等于两个列添加索引。但是需要满足最左前缀
3.全文索引(full-text)
只能在 char、varchar、text 等字段才可以使用全文索引 全文索引是抽取一列内容的关键字,通过关键字建立索引。例如:我们都在上海工作当搜索上海工作这句话。所以全文索引适用于含有 like 的查询。可以解决‘xxxx%’模糊查询低效的问题。
四 索引管理
建立索引可以在建立表时直接指定索引,也可以后期添加索引,注意主键约束自动带有主键索引,唯一约束自动带有唯一索引。在 MySQL 中,对索引的查看和删除操作是所有索引类型通用的。
1.普通索引
2.唯一索引
与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。创建唯一索引 :CREATE UNIQUE INDEX indexName ON table(column(length));修改表结构 :ALTER TABLE table_name ADD UNIQUE indexName ON (column(length));创建表的时候直接指定 :CREATE TABLE table (id int(11) NOT NULL AUTO_INCREMENT ,title char(255) CHARACTER NOT NULL ,content text CHARACTER NULL ,time int(10) NULL DEFAULT NULL ,UNIQUE indexName (title(length)));
3.主键索引
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引CREATE TABLE table (id int(11) NOT NULL AUTO_INCREMENT ,title char(255) NOT NULL ,PRIMARY KEY (id));
4.组合索引
指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀匹配原则。ALTER TABLE table_name ADD INDEX index_name (name,city,age);
5.全文索引
MySQL 从 3.23 版开始支持全文索引和全文检索,FULLTEXT 索引在 MySQL5.6 之前仅可用于 MyISAM 表,在 MySQL5.7 后 InnoDB 也支持;他们可以从 CHAR、VARCHAR 或 TEXT 列中作为 CREATE TABLE 语句的一部分被创建,或是随后使用 ALTER TABLE 或 CREATE INDEX 被添加。对于较大的数据集,将你的资料输入一个没有 FULLTEXT 索引的表中,然后创建索引,其速度比把资料输入现有 FULLTEXT 索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。全文索引对中文支持不好,如果搜索中文就只能按照最左对照进行搜索。如果是英文就可以匹配中间。直接创建全文索引:CREATE FULLTEXT INDEX index_content ON table(column);修改表结构添加全文索引:ALTER TABLE table ADD FULLTEXT index_content(column);创建表时添加全文索引CREATE TABLE table (id int(11) NOT NULL AUTO_INCREMENT ,title char(255) CHARACTER NOT NULL ,content text CHARACTER NULL ,time int(10) NULL DEFAULT NULL ,PRIMARY KEY (id),FULLTEXT (content));
五 索引优化
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点。虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、UPDATE和 DELETE 次数大于查询次数时,放弃索引。因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。索引只是提高效率的一个因素,如果你的 MySQL 有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。
1.使用短索引(前缀索引)
对字符串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个 CHAR(255)的列,如果在前 10 个或 20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和 I/O 操作CREATE INDEX index_name ON table_name (column(length));
2.索引列排序
MySQL 查询只使用一个索引,因此如果 where 子句中已经使用了索引的话,那么 orderby 中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建组合索引。
3.like 语句操作
一般情况下不鼓励使用 like 操作,如果非使用不可,如何使用也是一个问题。like “%aaa%”不会使用索引,而 like “aaa%”(非前导模糊查询)可以使用索引
4.不要在列上进行运算
例如:select * from users where YEAR(adddate)<2007,将在每个行上进行运算,这将导致 索 引 失 效 而 进 行 全 表 扫 描 , 因 此 我 们 可 以 改 成 : select * from users whereadddate<’2007-01-01′。应该把计算放在业务代码上完成,而不是交给数据库
5.范围列可以使用索引
范围条件有:<、<=、>、>=、between 等。范围列可以用到索引(联合索引必须是最左前缀),但是范围列后面的列无法用到索引,索引最多用于一个范围列,如果查询条件中有两个范围列则无法全用到索引。所以 where中把最主要的查询条件放在第一个。
6.类型转换会导致索引无效
当列是文本类型时,把数值类型当作列的条件会弃用索引explain select * from teacher where name = 20;
7.优化总结
最后总结一下,MySQL 只对以下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的 like(不以通配符%或_开头的情形)。而理论上每张表里面最多可创建 16 个索引,不过除非是数据量真的很多,否则过多的使用索引也不是那么好玩的
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~