mysql表怎么建立索引 mysql建表建索引

如何为表建立索引?建立索引的优缺点:
为什么要创建索引呢?
这是因为,创建索引可以大大提高系统的性能 。
第一、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性 。
第二、可以大大加快 数据的检索速度,这也是创建索引的最主要的原因 。
第三、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义 。
第四、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间 。
第五、通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能 。
也许会有人要问:增加索引有如此多的优点 , 为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性 。虽然 , 索引有许多优点, 但是,为表中的每一个列都增加索引,是非常不明智的 。
这是因为,增加索引也有许多不利的一个方面:
第一、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加 。
第二、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间 。如果要建立聚簇索引 , 那么需要的空间就会更大 。
第三、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度 。
什么样的字段适合创建索引:
索引是建立在数据库表中的某些列的上面 。因此 , 在创建索引的时候 , 应该仔细考虑在哪些列上可以创建索引 , 在哪些列上不能创建索引 。
一般来说,应该在这些列上创建索引 , 例如:
第一、在经常需要搜索的列上 , 可以加快搜索的速度;
第二、在作为主键的列上 , 强制该列的唯一性和组织表中数据的排列结构;
第三、在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
第四、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
第五、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
第六、在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度 。
建立索引,一般按照select的where条件来建立,比如: select的条件是where f1 and f2,那么如果我们在字段f1或字段f2上简历索引是没有用的,只有在字段f1和f2上同时建立索引才有用等 。
什么样的字段不适合创建索引:
同样,对于有些列不应该创建索引 。一般来说,不应该创建索引的的这些列具有下列特点:
第一,对于那些在查询中很少使用或者参考的列不应该创建索引 。这是因为,既然这些列很少使用到,因此有索引或者无索引,
并不能提高查询速度 。相反,由于增加了索引 , 反而降低了系统的维护速度和增大了空间需求 。
第二,对于那些只有很少数据值的列也不应该增加索引 。这是因为,由于这些列的取值很少 , 例如人事表的性别列 ,
在查询的结果中 , 结果集的数据行占了表中数据行的很大比 例,即需要在表中搜索的数据行的比例很大 。
增加索引,并不能明显加快检索速度 。
第三,对于那些定义为text, p_w_picpath和bit数据类型的列不应该增加索引 。这是因为,这些列的数据量要么相当大,要么取值很少 。
第四 , 当修改性能远远大于检索性能时 , 不应该创建索 引 。这是因为,修改性能和检索性能是互相矛盾的 。
当增加索引时,会提高检索性能 , 但是会降低修改性能 。当减少索引时,会提高修改性能,降低检索性能 。
因此,当修改性能远远大于检索性能时,不应该创建索引 。
创建索引的方法::
1、创建索引 , 例如 create index 索引的名字 on table_name (列的列表);
2、修改表 , 例如 alter table table_name add index[索引的名字] (列的列表);
3、创建表的时候指定索引,例如create table table_name ( [...], INDEX [索引的名字] (列的列表) );
查看表中索引的方法:
show index from table_name; 查看索引
索引的类型及创建例子::
1.PRIMARY KEY (主键索引)
mysql alter table table_name add primary key ( `column` )
2.UNIQUE 或 UNIQUE KEY (唯一索引)
mysql alter table table_name add unique (`column`)
3.FULLTEXT (全文索引)
mysql alter table table_name add fulltext (`column` )
4.INDEX (普通索引)
mysql alter table table_name add index index_name ( `column` )
5.多列索引 (聚簇索引)
mysql alter table `table_name` add index index_name ( `column1`, `column2`, `column3` )
修改表中的索引:
alter table tablename drop primary key,add primary key(fileda,filedb)
mysql如何建立索引我们可以通过查看索引的属性来判断创建索引的方法 。
查看索引的语法格式如下:
SHOW INDEX FROM 表名 [ FROM 数据库名]
语法说明如下:
表名:指定需要查看索引的数据表名 。
数据库名:指定需要查看索引的数据表所在的数据库,可省略 。比如 , SHOW INDEX FROM student FROM test; 语句表示查看 test 数据库中 student 数据表的索引 。
示例
使用 SHOW INDEX 语句查看《MySQL创建索引》一节中 tb_stu_info2 数据表的索引信息,SQL 语句和运行结果如下所示 。
mysql SHOW INDEX FROM tb_stu_info2\G
1. row
Table: tb_stu_info2
Non_unique: 0
Key_name: height
Seq_in_index: 1
Column_name: height
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
【mysql表怎么建立索引 mysql建表建索引】Comment:
Index_comment:
1 row in set (0.03 sec)
其中各主要参数说明如下:
参数 说明
Table 表示创建索引的数据表名,这里是 tb_stu_info2 数据表 。
Non_unique 表示该索引是否是唯一索引 。若不是唯一索引,则该列的值为 1;若是唯一索引 , 则该列的值为 0 。
Key_name 表示索引的名称 。
Seq_in_index 表示该列在索引中的位置,如果索引是单列的,则该列的值为 1;如果索引是组合索引 , 则该列的值为每列在索引定义中的顺序 。
Column_name 表示定义索引的列字段 。
Collation 表示列以何种顺序存储在索引中 。在 MySQL 中,升序显示值“A”(升序),若显示为 NULL,则表示无分类 。
Cardinality 索引中唯一值数目的估计值 。基数根据被存储为整数的统计数据计数,所以即使对于小型表 , 该值也没有必要是精确的 。基数越大,当进行联合时,MySQL 使用该索引的机会就越大 。
Sub_part 表示列中被编入索引的字符的数量 。若列只是部分被编入索引,则该列的值为被编入索引的字符的数目;若整列被编入索引,则该列的值为 NULL 。
Packed 指示关键字如何被压缩 。若没有被压缩,值为 NULL 。
Null 用于显示索引列中是否包含 NULL 。若列含有 NULL,该列的值为 YES 。若没有 , 则该列的值为 NO 。
Index_type 显示索引使用的类型和方法(BTREE、FULLTEXT、HASH、RTREE) 。
Comment 显示评注 。
Mysql建立索引经验在实际开发中使用数据库时,难免会遇到一些大表数据,对这些数据进行查询时,有时候SQL会查询得特别慢,这时候,有经验mysql表怎么建立索引的老师傅会告诉你,你看一下哪几个字段查的多,加一个索引就好了 。
那么,怎么合理地建立索引呢mysql表怎么建立索引?这里分享一下我的一些经验,如有不妥之处,欢迎批评指正 。
1、不要盲目建立索引,先分析再创建
索引虽然能大幅度提升我们的查询性能 , 但也要知道,在你进行增删改时,索引树也要同样地进行维护 。所以,索引不是越多越好,而是按需建立 。最好是在一整块模块开发完成后,分析一下,去针对大多数的查询,建立联合索引 。
2、使用联合索引尽量覆盖多的条件
这是说在一个慢sql里假如有五个where ,一个 order by,那么我们的联合索引尽量覆盖到这五个查询条件 , 如果有必要,order by 也覆盖上。
3、小基数字段不需要索引
这个意思是 , 如果一张表里某个字段的值只有那么几个 , 那么你针对这个字段建立的索引其实没什么意义,比如说,一个性别字段就两种结果,你建了索引,排序也没什么意思(也就是索引里把男女给分开了)
所以说,索引尽量选择基数大的数据去建立 , 能最大化地利用索引
4、长字符串可以使用前缀索引
我们建立索引的字段尽量选择字段类型较小的,比如一个varchar(20)和varchar(256)的 , 我们在20的上面建立的索引和在256上就有明显的差距(字符串那么长排序也不好排呀,唉) 。
当然,如果一定是要对varchar(256)建立索引,我们可以选择里面的前20个字符放在索引树里(这里的20不绝对,选择能尽量分辨数据的最小字符字段设计),类似这样KEY index(name(20),age,job) ,索引只会对name的前20个字符进行搜索,但前缀索引无法适用于order by 和 group by 。
5、对排序字段设计索引的优先级低
如果一个SQL里我们出现了范围查找,后边又跟着一个排序字段,那么我们优先给范围查找的字段设置索引 , 而不是优先排序 。
6、如果出现慢SQL,可以设计一个只针对该条SQL的联合索引 。
不过慢SQL的优化,需要一步步去进行分析,可以先用explain查看SQL语句的分析结果,再针对结果去做相应的改进 。explain的东西我们下次再讲 。
PS:在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是 执行这条SQL 。
MySQL如何为表字段添加索引1.添加PRIMARY KEY(主键索引):
2.添加UNIQUE(唯一索引) :
3.添加INDEX(普通索引) :
4.添加FULLTEXT(全文索引) :
5.添加多列索引:
MYSQL创建表的时候如果加 索引兄弟,primary key是主键,每个表只能有一个主键,而且数据是唯一的 。\x0d\x0a可以这样写:\x0d\x0aCREATE TABLE IF NOT EXISTS `".$ctb_name."` (\x0d\x0a`id` INT(9) NOT NULL AUTO_INCREMENT PRIMARY KEY,\x0d\x0a`keyid` VARCHAR(20) NOT NULL,\x0d\x0a`key` VARCHAR(20) NOT NULL,\x0d\x0a`stauts` BOOL NOT NULL DEFAULT'0',\x0d\x0aindex `idx_status`(`status`)\x0d\x0a )ENGINE = MYISAM DEFAULT CHARSET=utf8;\x0d\x0a不过,status是bool类型的字段,只有true和false , 区分度太低,没有必要加索引 。\x0d\x0a\x0d\x0a索引目的是为了使查询更快 , 区分度小的时候不如全表扫描 。
mysql表怎么建立索引的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于mysql建表建索引、mysql表怎么建立索引的信息别忘了在本站进行查找喔 。

    推荐阅读