word的意思?(详解 MySQL 中的字段索引和主键)

wufei123 发布于 2023-11-17 阅读(515)

索引的类型UNIQUE 唯一索引:不可以出现相同的值,可以有NULL值INDEX 普通索引:允许出现相同的索引内容PROMARY KEY 主键索引:不允许出现相同的值fulltext index 全文索引:可以针对值中的某个单词,但效率确实不敢恭维组合索引:实质上是将多个字段建到一个索引里,列值的组合必须唯一

一张表中只能有一个主键一个主键可以指向多列,叫做复合主键;主键索引应该给 ID,并且 ID 自增;主键索引效率最高,不能为空,不能重复;设置复合主键方法一:在建表时就写出Create Table 表名( 字段名1 Int Not Null,字段名2 nvarchar(13) Not Null Primary Key (字段名1,字段名2),字段名3…………,字段名N…………)

word的意思?(详解 MySQL 中的字段索引和主键)

方法二:在建表后更改ALTER TABLE 表名 WITH NOCHECK ADDCONSTRAINT [PK表名] PRIMARY KEY NONCLUSTERED([字段名1],[字段名2])索引的创建

创建表的时候同时创建索引CREATE TABLE table ( id int(11) NOT NULL AUTOINCREMENT, title char(255) CHARACTER SET utf8 COLLATE utf8generalci NOT NULL, content text CHARACTER SET utf8 COLLATE utf8generalci NULL, time int(10) NULL DEFAULT NULL, PRIMARY KEY (id), INDEX indexname (title(length))

修改表结构的方式添加索引ALTER TABLE 表名 ADD 索引类型(unique,primary key,fulltext,index)[索引名](字段名)普通索引alter table tablename add index indexname (columnlist);

唯一索引alter table tablename add unique (columnlist);主键索引alter table tablename add primary key (columnlist);

CREATE INDEX indexname ON tablename(username(length));create 只能添加这两种索引;CREATE INDEX indexname ON tablename (columnlist)CREATE UNIQUE INDEX indexname ON tablename (columnlist)

索引查询desc tablename;show keys from tablename;show index from tablename;show indexs from tablename;删除索引

删除索引可以使用 ALTER TABLE 或 DROP INDEX 语句来实现drop index indexname on tablename ;alter table tablename drop index indexname ;alter table tablename drop primary key ;。

注意事项1.索引不会包含有NULL的列只要列中包含有NULL值,都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此符合索引就是无效的2.使用短索引对串列进行索引,如果可以就应该指定一个前缀长度。

例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作3.索引列排序mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。

因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引4.like 语句操作一般情况下不鼓励使用like操作,如果非使用不可,注意正确的使用方式。

like ‘%aaa%’和‘%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只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用。

14.对于多列索引,只要查询语句使用到了左边的列,就会用到索引,否则不会用到索引15.对于or sql语句,必须所有的被查询的列都建有索引,才会用到索引16.如果被查询的列的类型是字符串,则需要在语句中对数据添加引号,比如:。

select * from emp where ename=1111;不能是select * from emp where ename=1111;索引的使用情况查询查看索引的使用情况show status like Handlerread%

大家注意:Handlerread 这个值越高越好,越高表示使用索引查询的次数越多Handlerreadrndnext 这个值越高,说明查询低效全文检索LIKE 搜索SELECT body FROM tablename WHERE body LIKE "%randomword1%" AND bodyLIKE "% randomword2%" AND body LIKE "% randomword3%";

FULLTEXT 搜索SELECT body FROM tablename WHERE MATCH(body) AGAINST("+randomword3+ randomword3+ randomword3" IN BOOLEAN MODE)

结果讨论LIKE 搜索的耗时随着记录数的增加而线性增长,但对于10万行记录以下的表(这里共100000*50个单词)搜索时间基本上能保持在1秒以内,所以 like 搜索的性能也不是特别差由不同词汇量生成的文本对 LIKE 搜索的性能影响不大,不同词汇量对应的搜索时间基本上在一个很小的时间范围内变化。

FULLTEXT 搜索耗时也随表中记录数的增长而线性增加对于10万行记录以下的表(这里共100000*50个单词)搜索时间基本上能保持在0.01秒以内由不同词汇量生成的随机文本对FULLTEXT搜索性能有相对来说比较显著的影响。

每行记录中含同样的单词数,这样,较大的词汇量倾向于生成冗余度更低的文本,相应的搜索耗时倾向于更少这可能与FULLTEXT索引建立单词索引的机制有关,较大的词汇量倾向于生成范围广但相对较浅的索引,因而能快速确定文本是否匹配。

与 LIKE 搜索相比,FULLTEXT 全文搜索的性能要强很多,对于10万行记录的表,搜索时间都在0.02秒以下因此可以将基于 FULLTEXT 索引的文本搜索部署于网站项目中的文本搜索功能中但是正如上述提到的,无论是 LIKE 搜索还是 FULLTEXT 搜索,其性能都会随着记录数的增长而下降,因此若网站项目中的文本搜索数据库记录数庞大的一定规模后,可能需要考虑使用 MySQL 数据库全文搜索以外的文本搜索解决方案了。

亲爱的读者们,感谢您花时间阅读本文。如果您对本文有任何疑问或建议,请随时联系我。我非常乐意与您交流。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

宝骏汽车 新闻9270