这是第一次在这发博文也算是学习笔记,主要也是最近在学习MySQL,能借助这么一个平台来督促自己以及能让大家多批评指导,在此过程中能提高。

         这一次主要是索引。也是比较基础的,等有了更进一步的学习再继续

        索引是加快对数据表内容的访问基本访问手段,尤其是在多个表的关联查询中。 其实在数据库的查询优化中,通常能造成查询速度最大变化就是索引的正确使用。这里需要是“正确”,因为不合理或者过多的索引其实没有什么作用。如果想提高查询的速度,首先考虑的就应该是索引,然后再看看是否还有其他的技术。

        一、创建索引: 

             1、MySQL可以创建好几种,主要

                 唯一索引:这种索引不允许索引项本身出现重复值。可以通过几种方式创建:                                 

                          创建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);

                          修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);

                          创建表的时候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );

                普通索引:这种索引的有点是允许索引值出现重复                     

                         创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);

                         修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);

                         创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );

                FULLTEXT索引:用来进行全文检索。这种索引只适用于MyISAM数据表。FULLTEXT索引只能对CHAR, VARCHARTEXT列编制索引,并且只能在MyISAM表中编制。

                         创建方法与上面的语法相同。

                spatial索引:这种索引值适用于MyISAM数据表和空间数据类型。

                hash索引:这是memory数据表的默认索引类型。

              以上提到的创建方法都可以用来创建索引,但是MySQL会在其内部把create index语句映射为alter table操作,所以说alter table比create index语句更灵活多能,它能可以用来创建MySQL所能支持的任

              一  种索引。如:

                               alter table tb_name add FULLTEXT index_name(index_columns);

                               alter table tb_name add INDEX index_name(index_columns);                其中:tb_name为表明,index_name为索引名,index_columns为要天添加索引的列名

                               alter table tb_name add UNIQUE index_name(index_columns);

                        如果索引由多个数据列组成,要用逗号将其隔开。因为 index_name是可选的,如果你没有给出索引名,MySQL将根据第一个带索引的数列给它挑选一个名字。

                        如果对某个字符串的数据列的前缀编索引。

                               Create table addresslist

                               (

                                Name char(30) not null,

                               Address binary(60) not null,

                               Index(name(10)),                              在BLOB或者TEXT数据列上只能创建前缀型索引,FUllText索引锁涉及的数据列都是带索引的,没有前缀的说法。

                               Index(address(15))

                               );

            二、删除索引:

                             Drop index index_name on tbl_name;也可以使用Alter table tb_name drop index index_name;

                             当你不知道某个给定数据表的索引的名字,可以使用show create table 或者show index把他查出来。                     

                             如果你删除了组成某个索引的数据列,MySQL将删除这个索引。

           三、索引的优点:

                如果我们要查询一个学生的数据行,就需要检查数据表的每一个数据行,这是一个完成扫描,如果数据量很大,那么工作时间也会很长。 

                索引可以提高效率的一个原因是

                        我们可以得知匹配数据行在什么位置结束,从而跳过其余部分。

                        定位算法的使用。

           四、索引的缺点:

                1.就是降低了在带索引的数据列里插入、删除以及修改数值的速度。之所以慢,因为在插入一条数据的时候,不仅插入到数据行中,它还要求索引文件要做出改变

                 (对于那些写操作比较多的数据表,索引更新方面的开销比较大。)

                2.索引本身也要消耗存储空间。

                3.索引在运行时也需要消耗资源来维护索引。

          五、索引的选择:

                1.尽量为用来搜索、分类、分组的数据列编制索引,不要为作为输出显示的数据列编制索引。换句话说最适合有索引的就是数据列是那些在where 中出现的列,或者是order by或者是group by中的列

                2.综合考虑个数据列的维度势。数据列的维度就是它所能容纳的非重复的个数。比如112233,维度就是3。 它的维度越大,唯一行越高,索引的使用效果就越好

                   注:当查询优化程序确定出某一个数值在数据表的数据行中出现频率操作30%时,查询优化程序通常会直接跳过索引,而进行全表的扫描

                3.对短小的值进行索引。数据类型的选择很重要。其带来的好处有:a.短小的值可以让比较操作更快的完成,加快索引查找的速度

                                                                                                    b.短小的值可以让索引的“体积”更小,减少磁盘I/O活动

                                                                                                    c.短小的值意味着键缓存里面的索引快能容纳更多的键值

               4.对字符串值的前缀编制索引,因为大多数的值的前10个字符都是唯一的。这样可以节省索引中的大量空间。

               5.充分利用最左边的前缀。

               6.适可而止,不要建立过多的索引。每一个多出的索引都要额外的磁盘空间。MySQL服务器无法选择出最好的索引来使用。

               7.让索引的类型与你打算进行比较操作的类型保持匹配 。           

 

 

                

 

                 

   

 posted on 2013-05-24 13:18  evencao  阅读(131)  评论(0编辑  收藏  举报