Mysql索引类型分析

一、简介
MySQL目前主要有以下几种索引类型:
1.普通索引
2.唯一索引
3.主键索引
4.组合索引
5.全文索引
二、语句
CREATE TABLE table_name[col_name data type][unique|fulltext][index|key][index_name](col_name[length])[asc|desc]
1.unique|fulltext为可选参数,分别表示唯一索引、全文索引
2.index和key为同义词,两者作用相同,用来指定创建索引
3.col_name为需要创建索引的字段列,该列必须从数据表中该定义的多个列中选择
4.index_name指定索引的名称,为可选参数,如果不指定,默认col_name为索引值
5.length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度
6.asc或desc指定升序或降序的索引值存储
三、索引类型
1.普通索引
是最基本的索引,它没有任何限制。它有以下几种创建方式:
(1)直接创建索引
 CREATE INDEX index_name ON table(column(length))

 

(2)修改表结构的方式添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column(length))

 

(3)创建表的时候同时创建索引
CREATE TABLE `table` (`id` int(11) NOT NULL AUTO_INCREMENT ,`title` char(255) CHARACTER NOT NULL ,`content` text CHARACTER NULL ,`time` int(10) NULL DEFAULT NULL ,PRIMARY KEY (`id`),INDEX index_name (title(length)))

 

(4)删除索引
DROP INDEX index_name ON table
2.唯一索引
与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
(1)创建唯一索引
CREATE UNIQUE INDEX indexName ON table(column(length))
(2)修改表结构
ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))
(3)创建表的时候直接指定
CREATE TABLE `table` (`id` int(11) NOT NULL AUTO_INCREMENT ,`title` char(255) CHARACTER NOT NULL ,`content` text CHARACTER NULL ,`time` int(10) NULL DEFAULT NULL ,UNIQUE indexName (title(length)));

 

3.主键索引
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引:
 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) NOT NULL , PRIMARY KEY (`id`) );
 
4.组合索引
指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合
ALTER TABLE `table` ADD INDEX name_city_age (name,city,age);
5.全文索引
主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。
(1)创建表的适合添加全文索引
CREATE TABLE `table` (`id` int(11) NOT NULL AUTO_INCREMENT ,`title` char(255) CHARACTER NOT NULL ,`content` text CHARACTER NULL ,`time` int(10) NULL DEFAULT NULL ,PRIMARY KEY (`id`),FULLTEXT (content));

 

(2)修改表结构添加全文索引
ALTER TABLE article ADD FULLTEXT index_content(content)
(3)直接创建索引
CREATE FULLTEXT INDEX index_content ON article(content)
四、缺点
1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update和delete。因为更新表时,不仅要保存数据,还要保存一下索引文件。
2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。
索引只是提高效率的一个因素,如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。
五、注意事项
使用索引时,有以下一些技巧和注意事项:
1.索引不会包含有null值的列
只要列中包含有null值都将不会被包含在索引中,复合索引中只要有一列含有null值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为null。
2.使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
3.索引列排序
查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
4.like语句操作
一般情况下不推荐使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
5.不要在列上进行运算
这将导致索引失效而进行全表扫描,例如
SELECT * FROM table_name WHERE YEAR(column_name)<2017;
6.不使用not in和<>操作

 

 

 

人生成功的秘诀是当好机会来临时,立刻抓住它。 —— 狄斯累利

转载于:https://www.cnblogs.com/afeige/p/10816484.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一次使用pt-query-digest工具分析MySQL慢查询日志

最近遇到了MySQL性能问题&#xff0c;使用percona 的 pt-query-digest工具分析性能的瓶颈点。并且pt-query-digest工具要优于MySQL本身自带的mysqldumpslow工具。 查看pt-query-digest工具在ubuntu下的安装流程请看&#xff1a;ubuntu下安装pt-query-digest_一缕阳光a的博客-CS…

App 运营的指标具体都有哪些?(四)

因产品而异&#xff0c;要看产品类型的工具类&#xff0c;启动次数很重要&#xff1b;社区类&#xff0c;活跃用户和UGC很重要&#xff1b;游戏&#xff0c;在线人数和arpu值是关键。。。转载于:https://blog.51cto.com/yerik/1166365

骗子公司陆续公布中...

11年04月11日&#xff0c;在网吧投简历&#xff0c;突然一条短信&#xff0c;算是收到的第一个面试通知&#xff0c;有点激动&#xff0c;“通诚公司”&#xff0c;而且我们4个同时收到&#xff0c;第一感觉就是不对劲&#xff0c;公司面试通知都会电话通知的&#xff0c;去百度…

Hadoop2.4.1入门实例:MaxTemperature

版权声明&#xff1a;本文为博主原创文章。转载请注明来自http://blog.csdn.net/jediael_lu/ https://blog.csdn.net/jediael_lu/article/details/37596469 注意&#xff1a;下面内容在2.x版本号与1.x版本号相同适用&#xff0c;已在2.4.1与1.2.0进行測试。一、前期准备 1、创建…

Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值?

之前的两篇有关EF4.1的文章反响不错&#xff0c;感谢大家的支持&#xff01;想体验EF4.1的新功能&#xff1f;RTW版本已经发布啦&#xff0c;http://www.microsoft.com/downloads/en/details.aspx?FamilyIDb41c728e-9b4f-4331-a1a8-537d16c6acdf&displaylangen Entity …

[WorldWind学习]5.相机对象

首先查看WorldWindow的事件&#xff1a;OnMouseUp、OnMouseMove、HandleKeyDown&#xff0c;这几个方法中多次调用this.drawArgs.WorldCamera的各种属性实现了场景的控制&#xff0c;包括球的旋转、场景的放大缩小&#xff0c;上下移动。 1. 接下来查看CameraBase类RotationYaw…

MySQL中varchar(11)与int(11)的区别

结果&#xff1a; 对于varchar(11)&#xff1a;最多存储11个字符&#xff0c;超过则不存。 mysql> create table tt(c1 int primary key,c2 varchar(50))enginexxx; Query OK, 0 rows affected (0.15 sec)mysql> insert into tt values(1, aaaaaaaaaabbbbbbbbbbccccccc…

@Slf4j

注解Slf4j:&#xff08;当前日志为logback,其他日志框架不祥&#xff09; 直接使用log.xxxx("mothod is start") 例如&#xff1a;log.info("/returncode/add start"); 代替 如果不想每次都写 private final Logger logger LoggerFactory.getLog…

在VS2010开发的MVC3 应用程序中设定默认的浏览器

vs2010做mvc3 开发,用的是Razor的View,想修改默认浏览器,发现右键没有"浏览方式",把View改成.aspx的,也没有找到这个选项. 解决方法两种 (1)最简单的,建个Asp.net Web应用程序,在随便一个xxx.aspx页面,右键"浏览方式"即可.. (2)通过修改项目属性也可以,右键…

hdu 1161 Eddy's mistakes

http://acm.hdu.edu.cn/showproblem.php?pid1161 本题主要运用的就是大小写的转换&#xff1b; 我写的代码&#xff1a; #include<iostream>#include <string>#include <ctype.h>using namespace std;int main(int argc, char *argv[]){ string a; ch…

今年适合买房吗

本人是程序员&#xff0c;今天不聊程序相关的事情。不过今天有了点时间&#xff0c;考虑了下今年是否适合买房这件事。因为从中央到地方都在鼓励买房&#xff0c;每个人根据自己的实际情况决定是否要买房。 优点&#xff1a; (1)、房贷利率低&#xff0c;基本上是历史低点了 …

[18]Debian Linux Install GNU GCC Compiler and Development Environment

# apt-getinstall build-essential# gcc -v# make -v转载于:https://www.cnblogs.com/smartvessel/archive/2011/04/16/2018459.html

FireEye:2012年下半年高级威胁分析报告

最近&#xff0c;fireeye发布了2012年的高级威胁分析报告。根据对超过8900万获取的恶意代码事件进行分析&#xff0c;Fireeye认为&#xff1a; 1&#xff09;平均一个组织和单位每三分钟就会遭受一次恶意代码***&#xff0c;特指带有恶意附件、或者恶意WEB链接、或者CnC通讯的邮…

main()的参数argc与argv

C语言中的main()函数,一般会带有2个参数,例如int main (int argc, char* argv[]),这是一个典型的main函数的声明。 参数如下&#xff1a; argc: 整数, 为传给main()的命令行参数个数。 argv: 字符串数组。 在DOS 3.X 版本中, argv[0] 为程序运行的全路径…

数组中的forEach和map的区别

大多数情况下&#xff0c;我们都要对数组进行遍历&#xff0c;然后经常用到的两个方法就是forEach和map方法。先来说说它们的共同点 相同点 都是循环遍历数组中的每一项forEach和map方法里每次执行匿名函数都支持3个参数&#xff0c;参数分别是item&#xff08;当前每一项&…

1298 FORZA David Beckham

经典01背包问题&#xff0c;没有什么陷阱&#xff0c;唯一要求就是要优化空间复杂度&#xff01;下面是关于01背包的讲解&#xff1a; 01背包问题是最基础的背包问题&#xff0c;特点是&#xff1a;每种物品仅有一件&#xff0c;可以选择放或不放。用子问题定义状态&#xff1a…

android 获取lanucher 列表

引用&#xff1a;http://www.iteye.com/topic/696187 获取Launcher 启动列表 即 列出所有Launcher程序 通过PackageManager 来获取 [代码 步骤] 1. 定义内部类 LauncherItem 用于定义Application相关属性 比如&#xff1a;图标 名称 以及 ComponentName Java代码 public clas…

对int变量赋值的操作是原子的吗?

对于例子如下&#xff1a; int count 0; count; // 是原子操作吗? count; 是原子操作吗? 先说答案&#xff1a; 1、在单处理器下&#xff0c;如果将 count; 语句 翻译为单指令时&#xff0c;是原子操作。 不过现在处理器都会对语句进行优化。 2、在多处理器下&#xf…

信号量进程同步与互斥

2.哲学家吃面问题 semaphore fork[5]; for(int i0; i<5;i) fork[i]1; cobegin process philosopher_i( ){ while(ture){ think( ); P(fork[i]); P(fork[(i10%5])&#xff1b; eat&#xff08;&#xff09;&#xff1b; V(fork[i]); V(fork[(i10%5])&#xff1b; } } coend 5…

企业面试中关于MYSQL重点的28道面试题解答

问题1&#xff1a;char、varchar的区别是什么&#xff1f; varchar是变长而char的长度是固定的。如果你的内容是固定大小的&#xff0c;你会得到更好的性能。 问题2: TRUNCATE和DELETE的区别是什么&#xff1f; DELETE命令从一个表中删除某一行&#xff0c;或多行&#xff0c;T…