mysql怎么修改索引 mysql修改索引会锁表吗

MySQL中如何设置唯一索引,联合索引?1.UNIQUE 关键字建唯一索引\x0d\x0amysql CREATE TABLE `wb_blog` (\x0d\x0a-`id` smallint(8) unsigned NOT NULL,\x0d\x0a-`catid` smallint(5) unsigned NOT NULL DEFAULT '0',\x0d\x0a-`title` varchar(80) NOT NULL DEFAULT '',\x0d\x0a-`content` text NOT NULL,\x0d\x0a-PRIMARY KEY (`id`),\x0d\x0a-UNIQUE KEY `catename` (`catid`)\x0d\x0a- ) ;\x0d\x0a如果建好表了,可以用以下语句建\x0d\x0a mysql CREATE UNIQUE INDEX catename ON wb_blog(catid);\x0d\x0a\x0d\x0a2.联合索引\x0d\x0aALTER TABLE `tasks`\x0d\x0aADD INDEX `testabc` (`title`, `created`) ;\x0d\x0a\x0d\x0a3联合唯一索引(假设有这个需求,在同一天内不能建两个tiltle一样的任务)\x0d\x0aALTER TABLE `tasks`\x0d\x0aADD UNIQUE INDEX `testabc` (`title`, `created`) ;\x0d\x0a\x0d\x0a数据库建索引的科学性事关数据库性能,索引也不是越多越好 。
mysql索引在mysql中,索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录 。
通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列即可 。
通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列 。否则 , 数据库系统将读取每条记录的所有信息进行匹配 。
可以把索引比作新华字典的音序表 。例如,要查“库”字,如果不使用音序,就需要从字典的 400 页中逐页来找 。但是,如果提取拼音出来,构成音序表,就只需要从 10 多页的音序表中直接查找 。这样就可以大大节省时间 。
因此,使用索引可以很大程度上提高数据库的查询速度,还有效的提高了数据库系统的性能 。
索引的优缺点
索引有其明显的优势,也有其不可避免的缺点 。
优点
索引的优点如下:
1、通过创建唯一索引可以保证数据库表中每一行数据的唯一性 。
2、可以给所有的 MySQL 列类型设置索引 。
3、可以大大加快数据的查询速度,这是使用索引最主要的原因 。
4、在实现数据的参考完整性方面可以加速表与表之间的连接 。
5、在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间
缺点
增加索引也有许多不利的方面,主要如下:
1、创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加 。
2、索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间 。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸 。
3、当对表中的数据进行增加、删除和修改的时候,索引也要动态维护 , 这样就降低了数据的维护速度 。
使用索引时,需要综合考虑索引的优点和缺点 。
MySQL性能优化之索引设计上一篇给小伙伴们讲了关于SQL查询性能优化的相关技巧,一个好的查询SQL离不开合理的索引设计 。这篇小二就来唠一唠怎么合理的设计一个索引来优化我们的查询速度,要是有不合理的地方...嗯..
当然啦,开个玩笑 , 欢迎小伙伴们指正!
通常情况下,字段类型的选择是需要根据业务来判断的,通常需要遵循以下几点 。
下列各种类型表格内容来自菜鸟教程 , 权当备忘 。
优化建议:
注意:INT(2)设置的为显示宽度,而不是整数的长度,需要配合ZEROFILL使用。
例如id设置为TINYINT(2) UNSIGNED,表示无符号,可以存储的最大数值为255,其中TINYINT(2)没有配合ZEROFILL实际没有任何意义,例如插入数字200,长度虽然超过了两位,但是这个时候是可以插入成功的,查询结果同样为200;插入数字5时,同样查询结果为5 。
而TINYINT(2)配合ZEROFILL后 , 当插入数字5时,实际存储的还是5,不过在查询是MySQL会在前面补上一个0,即查询出来的实际为05。
优化建议:
优化建议:
通常来说 , 考虑好表中每个字段应该使用什么类型和长度,建完表需要做的事情不是马上建立索引,而是先把相关主体业务开发完毕,然后把涉及该表的SQL都拿出来分析之后再建立索引 。
尽量少建立单值索引(唯一索引除外),应当设计一个或者两三个联合索引 , 让每一个联合索引都尽量去包含SQL语句中的where、order by、group by的字段,同时确保联合索引的字段顺序尽量满足SQL查询的最左前缀原则 。
索引基数是指这个字段在表里总共有多少个不同的值,比如一张表总共100万行记录,其中有个性别字段,性别一共有三个值:男、女、保密,那么该字段的基数就是3 。
如果对这种小基数字段建立索引的话 , 因为索引树中只有男、女、保密三个值,根本没法进行快速的二分查找,同时还需要回表查询,还不如全表扫描嘞 。
【mysql怎么修改索引 mysql修改索引会锁表吗】一般建立索引,尽量使用那些基数比较大的字段 , 那么才能发挥出B 树快速二分查找的优势来 。
在where和order by出现索引设计冲突时 , 是优先针对where去设计索引?还是优先针对order by设计索引?
通常情况下都是优先针对where来设计索引,因为通常情况下都是先where条件使用索引快速筛选出来符合条件的数据,然后对进行筛选出来的数据进行排序和分组,而where条件快速筛选出来的的数据往往不会很多 。
对生产实际运行过程中,或者测试环境大数据量测试过程中发现的慢查询SQL进行特定的索引优化、代码优化等策略 。
终于轮到实战了,小二最喜欢实战了 。
写到这里不得不吐槽一下,这个金三银四的跳槽季节,年前提离职了,结果离职还没办完就封村整整两个礼拜了 , 呜呜呜...
上节小二就提到会有个很有意思的小案例,那么在疫情当下,门都出不去的日子,感觉这个例子更有意思了,咱们来讨论一下各种社交平台怎么做的用户信息搜索呢 。
社交平台有一个小伙伴们都喜欢的功能,搜索好友信息,比如小二熟练的点开省份...城市..性别..年龄..身高...
咳咳咳...小二怎么可能干这种事情,小二的心里只有代码,嗯...没错,就是这样 。
这个就可以说是对于用户信息的查询筛选了 , 通常这种表都是非常大数据量的,在不考虑分库分表的情况下,怎么通过索引配合SQL来优化呢?
通常我们在编写SQL是会写出类似如下的SQL来执行 , 有where、order by、limit等条件来查询 。
那么接下来小二一个一个慢慢增加字段来分析分析,怎么根据业务场景来设计索引 。
针对这种情况,很简单,设计一个联合索引(provice, city, sex)就完事了 。
那么这时候有小伙伴就会说了,很简单啊 , 范围字段放最后咱还是知道的 , 联合索引改成(provice, city, sex, age)不就可以了 。
嗯 , 是的,这么干没毛病,但是小伙伴们有没有想过有些人万一既喜欢帅哥又喜欢美女 , 别想歪了哈...,挺多小姐姐就既喜欢帅哥又喜欢美女的 。
那么这个时候小姐姐就不搜索性别了 , 那么这个时候联合索引只能用到前两个字段了,那么不符合咱们的专业标准啊,咋办呢?这时候还是有办法的,咱们只需要动动小脑袋改改SQL就行了 , 在没有选择性别时判断一下,改成下面这样就可以了 。
咋办嘞,同样往联合索引里面塞,例如(provice, city, sex, hobby, xx, age)。
针对这种多个范围查询的话,为了比较好的利用索引,在业务允许的情况下可以使用固定范围,然后数据库字段存储范围标识就可以了 , 这样就转化为了等值匹配,就可以很好地利用索引了 。
例如最后登录时间字段不记录最后登录时间,而是记录设置字段is_login_within_seven_days在7天内有登录则为1,否则为0,最后索引设计成(provice, city, sex, hobby, xx, is_login_within_seven_days, age)。
那么根据场景最后设计出来的这个索引可能已经可以覆盖大部分的查询流量了,那么如果还有其他一部分热度比较高的查询怎么办呢,办法也很简单?。偌右涣礁鏊饕纯?。
例如通常会查询这个城市比较受欢迎(评分:score)的小姐姐,这时候添加一个联合索引(provice, city, sex, score)那么就可以了 。
可以看出,索引时必须结合场景来设计的,思路就是尽量用不超过3个复杂的联合索引来抗住大部分的80%以上的常用查询流量,然后再用一两个二级索引来抗下一些非常用查询流量 。
以上就是小二要给大家分享的索引设计 , 如果能动动你发财的小手给小二点个免费的赞就更好啦~
下篇小二就来讲讲MySQL事务和锁机制 。
MySQL当中如何删除某个字段的唯一索引或者修改该字段的唯一索引为普通索引-- 0.0 修改一下吧
alter table modify(字段 varchar(x)); -- 你应该懂我的意思吧
-- 删除索引
drop index on 索引名字;
mysql索引?create unique index ix_customerNo on customer(customerNo);
create unique index ix_CompanyName on customer(CompanyName);
mysql数据表 唯一索引需要修改成普通索引 怎么改?解决方案:先删除唯一索引,再在当前字段创建普通索引,参考下列说明以及SQL:
普通索引
普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度 。因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引 。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引 。
唯一索引
普通索引允许被索引的数据列包含重复的值 。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次 。
如果能确定某个数据列将只包含彼此各不相同的值 , 在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引 。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录 。也就是说,唯一索引可以保证数据记录的唯一性 。事实上 , 在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度 , 而只是为了避免数据出现重复 。
删除索引
可利用ALTER TABLE或DROP INDEX语句来删除索引 。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下 。
DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
创建索引
在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引 。
ALTER TABLE
ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引 。
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
mysql怎么修改索引的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于mysql修改索引会锁表吗、mysql怎么修改索引的信息别忘了在本站进行查找喔 。

    推荐阅读