MYSQL教程MySQL数据库查询索引优化
《MYSQL教程MySQL数据库查询索引优化》要点: 对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降.MYSQL数据库 小宝鸽试了一下,2.5万数据单表中,无索引:200ms-700ms,添加索引后10ms-15ms,使用redis缓存1ms-7ms,如果数据量更大的时候,索引效果将会更加明显.更甚者,多表查询.MYSQL数据库 ?MYSQL数据库 索引原理?MYSQL数据库 1、除了词典,生活中随处可见索引的例子,如火车站的车次表、图书的目录等.它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是我们总是通过同一种查找方式来锁定数据.MYSQL数据库 数据库也是一样,但显然要复杂许多,因为不仅面临着等值查询,还有范围查询(>、<、between、in)、模糊查询(like)、并集查询(or)等等.数据库应该选择怎么样的方式来应对所有的问题呢?我们回想字典的例子,能不能把数据分成段,然后分段查询呢?最简单的如果1000条数据,1到100分成第一段,101到200分成第二段,201到300分成第三段……这样查第250条数据,只要找第三段就可以了,一下子去除了90%的无效数据.但如果是1千万的记录呢,分成几段比较好?稍有算法基础的同学会想到搜索树,其平均复杂度是lgN,具有不错的查询性能.但这里我们忽略了一个关键的问题,复杂度模型是基于每次相同的操作成本来考虑的,数据库实现比较复杂,数据保存在磁盘上,而为了提高性能,每次又可以把部分数据读入内存来计算,因为我们知道访问磁盘的成本大概是访问内存的十万倍左右,所以简单的搜索树难以满足复杂的应用场景.MYSQL数据库 2、另外,比如学生信息表,添加学生姓名索引,索引是在name上排序的.现在,当查找某个学生信息时,就不需要逐行搜索全表,可以利用索引进行有序查找(如二分查找法),并快速定位到匹配的值,以节省大量搜索时间.MYSQL数据库 3、是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍.?MYSQL数据库
此查询结果应该为1000行,每行包含3个相等的值.在无索引的情况下处理此查询,必须寻找3个表所有的组合,以便得出与WHERE子句相配的那些行.而可能的组合数目为1000×1000×1000(十亿),显然查询将会非常慢.MYSQL数据库 如果对每个表进行索引,就能极大地加速查询进程.利用索引的查询处理如下.MYSQL数据库 (1)从表t1中选择第一行,查看此行所包含的数据.MYSQL数据库 (2)使用表t2上的索引,直接定位t2中与t1的值匹配的行.类似,利用表t3上的索引,直接定位t3中与来自t1的值匹配的行.MYSQL数据库 (3)扫描表t1的下一行并重复前面的过程,直到遍历t1中所有的行.MYSQL数据库 在此情形下,仍然对表t1执行了一个完全扫描,但能够在表t2和t3上进行索引查找直接取出这些表中的行,比未用索引时要快一百万倍.MYSQL数据库 利用索引,MySQL加速了WHERE子句满足条件行的搜索,而在多表连接查询时,在执行连接时加快了与其他表中的行匹配的速度.MYSQL数据库 索引的类型 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等.MYSQL数据库 1、普通索引MYSQL数据库 在创建普通索引时,不附加任何限制条件.这类索引可以创建在任何数据类型中,其值是否唯一和非空由字段本身的完整性约束条件决定.建立索引以后,查询时可以通过索引进行查询.例如,在student表的stu_id字段上建立一个普通索引.查询记录时,就可以根据该索引进行查询.MYSQL数据库 2、唯一性索引MYSQL数据库 使用UNIQUE参数可以设置索引为唯一性索引.在创建唯一性索引时,限制该MYSQL数据库 索引的值必须是唯一的.例如,在student表的stu_name字段中创建唯一性索引,那么stu_name字段的值就必需是唯一的.通过唯一性索引,可以更快速地确定某条记录.主键就是一种特殊唯一性索引.MYSQL数据库 3、全文索引MYSQL数据库 使用FULLTEXT参数可以设置索引为全文索引.全文索引只能创建在CHAR、VARCHAR或TEXT类型的字段上.查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度.例如,student表的information字段是TEXT类型,该字段包含了很多的文字信息.在information字段上建立全文索引后,可以提高查询information字段的速度.MySQL数据库从3.23.23版开始支持全文索引,但只有MyISAM存储引擎支持全文检索.在默认情况下,全文索引的搜索执行方式不区分大小写.但索引的列使用二进制排序后,可以执行区分大小写的全文索引.MYSQL数据库 4、单列索引MYSQL数据库 在表中的单个字段上创建索引.单列索引只根据该字段进行索引.单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引.只要保证该索引只对应一个字段 即可.MYSQL数据库 5、多列索引MYSQL数据库 多列索引是在表的多个字段上创建一个索引.该索引指向创建时对应的多个字段,可以通过这几个字段进行查询.但是,只有查询条件中使用了这些字段中第一个字段时,索引才会被使用.例如,在表中的id、name和sex字段上建立一个多列索引,那么,只有查询条件使用了id字段时该索引才会被使用.MYSQL数据库 6、空间索引MYSQL数据库 使用SPATIAL参数可以设置索引为空间索引.空间索引只能建立在空间数据类型上,这样可以提高系统获取空间数据的效率.MySQL中的空间数据类型包括GEOMETRY和POINT、LINESTRING和POLYGON等.目前只有MyISAM存储引擎支持空间检索,而且索引的字段不能为空值.对于初学者来说,这类索引很少会用到.MYSQL数据库 索引的操作 1、添加PRIMARY KEY(主键索引)MYSQL数据库 mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2、添加UNIQUE(唯一索引)MYSQL数据库 mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 3、添加INDEX(普通索引)MYSQL数据库 mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 4、添加FULLTEXT(全文索引)MYSQL数据库 mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 5、添加多列索引MYSQL数据库 ?MYSQL数据库 mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`,`column2`,`column3` ) 创建索引MYSQL数据库 在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引.MYSQL数据库 1、ALTER TABLEMYSQL数据库 ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引.MYSQL数据库 ALTER TABLE table_name ADD INDEX index_name (column_list) ? UNIQUE (column_list) ? PRIMARY KEY (column_list) 其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔.索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称.另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引.MYSQL数据库 2、CREATE INDEXMYSQL数据库 CREATE INDEX可对表增加普通索引或UNIQUE索引.MYSQL数据库 CREATE INDEX index_name ON table_name (column_list) ? UNIQUE ON table_name (column_list) table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选.另外,不能用CREATE INDEX语句创建PRIMARY KEY索引.MYSQL数据库 3、索引类型MYSQL数据库 在创建索引时,可以规定索引能否包含重复值.如果不包含,则索引应该创建为PRIMARY KEY或UNIQUE索引.对于单列惟一性索引,这保证单列不包含重复的值.对于多列惟一性索引,保证多个值的组合不重复.?MYSQL数据库
下面的SQL语句对students表在sid上添加PRIMARY KEY索引.MYSQL数据库 TABLE students KEY (sid)
删除索引MYSQL数据库 可利用ALTER TABLE或DROP INDEX语句来删除索引.类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下.MYSQL数据库 DROP ON talbe_name ? INDEX index_name ? KEY 其中,前两条语句是等价的,删除掉table_name中的索引index_name.MYSQL数据库 第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名.如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引.MYSQL数据库 如果从表中删除了某列,则索引会受到影响.对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除.如果删除组成索引的所有列,则整个索引将被删除.MYSQL数据库 注:一般数据库默认都会为主键生成索引MYSQL数据库 参考文章:? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |