MYSQL创建表的时候如果加 索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL创建表的时候如果加 索引相关的知识,希望对你有一定的参考价值。

mysql_query( "CREATE TABLE IF NOT EXISTS `".$ctb_name."` (

`id` INT(9) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`keyid` VARCHAR(20) NOT NULL,
`key` VARCHAR(20) NOT NULL,
`stauts` BOOL NOT NULL DEFAULT'0'

)ENGINE = MYISAM DEFAULT CHARSET=utf8; ") or die("dddddddasdddddd" ) ;

给字段`stauts`加上索引。

我在其后加了PRIMARY KEY,但是不能像`id`一样能用。

兄弟,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索引目的是为了使查询更快,区分度小的时候不如全表扫描。 参考技术A 兄弟,primary key是主键,每个表只能有一个主键,而且数据是唯一的。
可以这样写:
CREATE TABLE IF NOT EXISTS `".$ctb_name."` (
`id` INT(9) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`keyid` VARCHAR(20) NOT NULL,
`key` VARCHAR(20) NOT NULL,
`stauts` BOOL NOT NULL DEFAULT'0',
index `idx_status`(`status`)
)ENGINE = MYISAM DEFAULT CHARSET=utf8;
不过,status是bool类型的字段,只有true和false,区分度太低,没有必要加索引。

索引目的是为了使查询更快,区分度小的时候不如全表扫描。本回答被提问者和网友采纳

mysql索引

        索引的的创建跟存储的引擎是挂钩的,存储引擎表示不同数据在不同磁盘的不同组织形式。 

聚簇索引与非聚簇索引:取决于数据与索引是否是放在一起的。

  例如InnoDb就是只能有一个聚簇索引但可以有很多非聚簇索引(向InnoDb插入数据的时候必须要包含一个索引的key值,而且你创建表的时候如果不设置索引,索引的key值可以是主键,这也就是你平时创建表的时候为什么最好设置一个id字段,并且设置为主键自增。如果也没有主键的话,会使用唯一键作为索引,如果还没有唯一键的话,就会自生成一个,不同的数据库不同,但生成的这个是不可见的)

回表:

 

 

索引覆盖:

 

 

 

 

 

 

组合索引(最左匹配):

  平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:
–title,time
–title
为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示

–使用到上面的索引
SELECT * FROM article WHREE title=’测试’ AND time=1234567890;
SELECT * FROM article WHREE title=’测试’;
–不使用上面的索引
SELECT * FROM article WHREE time=1234567890;

 

索引下推(了解即可):

  

 

 

 

首先来说一下索引使用是的小技巧:

1.索引不会包含有NULL的列

       只要列中包含有NULL值,都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此符合索引就是无效的。

    2.使用短索引

       对串列进行索引,如果可以就应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

    3.索引列排序

       mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引。

    4.like语句操作

      一般情况下不鼓励使用like操作,如果非使用不可,注意正确的使用方式。like ‘%aaa%’不会使用索引,而like ‘aaa%’可以使用索引。

    5.不要在列上进行运算

    6.不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的

    7.索引要建立在经常进行select操作的字段上。

       这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。

    8.索引要建立在值比较唯一的字段上。

    9.对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少。

    10.在where和join中出现的列需要建立索引。

    11.where的查询条件里有不等号(where column != …),mysql将无法使用索引。

    12.如果where字句的查询条件里使用了函数(如:where DAY(column)=…),mysql将无法使用索引。

    13.在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用。

以上是关于MYSQL创建表的时候如果加 索引的主要内容,如果未能解决你的问题,请参考以下文章

sql 创建表的时候添加 表注释

MySQL索引

MySQL数据库之索引

MySQL创建表的时候创建索引

关于mysql建立临时表的问题(新手入门)

MySQL 索引相关知识详解