1、mysql索引(基础与规则)

索引规则:

一、MySQL建表,字段需设置为非空,需设置字段默认值。

二、MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL。

三、MySQL建表,如果字段等价于外键,应在该字段加索引。

四、MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比。

五、MySQL使用时,一条SQL语句只能使用一个表的一个索引。所有的字段类型都可以索引,多列索引的属性最多15个。

六、如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引,索引唯一值最高的索引。

七、建立索引index(part1,part2,part3),相当于建立了index(part1),index(part1,part2)和index(part1,part2,part3)三个索引。

八、MySQL针对like语法必须如下格式才使用索引:SELECT * FROM t1    WHERE key_col LIKE 'ab%';

九、SELECT COUNT(*)语法在没有where条件的语句中执行效率没有SELECT COUNT(col_name)快,但是在有where条件的语句中执行效率要快。

十、在where条件中多个and的条件中,必须都是一个多列索引的key_part属性而且必须包含key_part1。各自单一索引的话,只使用遍历最少行的那个索引。

十一、在where条件中多个or的条件中,每一个条件,都必须是一个有效索引。

十二、ORDER BY后面的条件必须是同一索引的属性,排序顺序必须一致(比如都是升序或都是降序)。

十三、所有GROUP BY列引用同一索引的属性,并且索引必须是按顺序保存其关键字的。

十四、JOIN索引,所有匹配ON和where的字段应建立合适的索引。

十五、对智能的扫描全表使用FORCE INDEX告知MySQL,使用索引效率更高。

十六、定期ANALYZE TABLE tbl_name为扫描的表更新关键字分布。

十七、定期使用慢日志检查语句,执行explain,分析可能改进的索引。

十八、条件允许的话,设置较大的key_buffer_size和query_cache_size的值(全局参数),和sort_buffer_size的值(session变量,建议不要超过4M)。

首先分析项目的数据表,都会有什么样的操作,比如产品列表,会按照分类、品牌等做where,按照时间、价格等排序(order by),所以做索引,个人觉得应该是按照业务逻辑去做。

索引类型:

(1)普通索引

最简单的索引方式,没有太多的约束,创建方式如下:

创建:create index indexname on tablename(column(length));如果是字符型的字段,要指定length

(建表时指定)create table tablename ([….],index [indexname] (column(length));

修改:alter tablename add index [indexname] on (column(length))

删除:drop index indexname on tablename

(2)唯一索引

和普通索引的区别就是列值要唯一,允许有空值。(组合索引那组合后的列值也必须唯一)

创建:create unique index indexname on tablename (column(length))

(健表时指定)create table ([….],unique [indexname] (column(length)))

修改:alter tablename add unique [indexname] on (column(length))

(3)主键索引

主键索引就比较清晰了,大家经常用到,只需要记住两个概念就行了,不能为空,列值唯一。

当然了,还有就是一个表只能有一个主键。

(4)全文索引

Mysql3.23开始支持全文索引,在项目中还真没用过,都用了sphinx全文检索了。所以在此不赘述了。

单列索引和组合索引

为了描述这两个概念,我们首先建一张测试表

Create table student(

Id int not null auto_increment primary key,

Name char(100) not null,

Age tinyint not null,

Score tinyint not null default 0

)engine=myisam default charset=gbk;

测试表名为student,字段name是名字,age是年龄,score是成绩。

现在有这么一条查询语句:select id from student where name=’arkulo’ and age=20 and score=90;

首先分析单列索引:

如果在name、age和score的每个字段上建立索引,那就会产生三个结果集,然后再取其交集,最后在得出查询结果

组合索引:

Alter table student add index name_age_score on (name(10),age,score);

建立组合索引,其中name(10),只提取名称的前部分,既能减少索引文件的体积,又能加快插入操作。

有了组合索引,就相当于有了如下三个索引:

(name,age,socre)

(name,age)

(name)

这也就是通常所说的“最左前缀”的概念,其实说简单点就是要按照索引的顺序进行排列

如果有了这个组合索引,那上面那条查询语句一次即可命中

什么时候用索引

首先mysql只对=,>,between,in,like使用索引,因此where和join(on)的时候就应该考虑到使用什么样的索引,而且要记住一条sql语句只能使用一个索引,比如有where和order by同时出现的时候,order by即使用的是索引字段,他也不会走索引。

索引的弱点

(1)加了索引之后,那insert、delete和update操作都要更新索引,会造成一些附加操作

(2)索引是保存在物理文件(.MYI)里的,所以如果在一张大表上创建索引,势必会造成索引文件也比较大

2、MySQL优化之索引创建规则表的主键、外键必须有索引;

数据量超过300的表应该有索引;

经常与其他表进行连接的表,在连接字段上应该建立索引;

经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;

索引应该建在选择性高的字段上;

索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;

复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:正确选择复合索引中的主列字段,一般是选择性较好的字段;

复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;

如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;

如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;

如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

频繁进行数据操作的表,不要建立太多的索引;

删除无用的索引,避免对执行计划造成负面影响;

以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引 与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合 索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。

mysql按升序创建索引_MySQL建立索引的基础规则相关推荐

  1. mysql 建立索引_mysql建立索引的原则

    1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录.例如,学生表中学号是具有唯一性的字段.为该字段建立唯一性索引可以很快的确定某个学生的信息.如果使用姓名的话,可能存在同 ...

  2. mysql按升序创建索引_Mysql中的降序索引底层实现

    什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引 ...

  3. mysql按升序创建索引_Mysql创建索引

    摘自:http://blog.chinaunix.net/uid-25063573-id-3032578.html 1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技 ...

  4. mysql按升序创建索引_MySQL创建索引(CREATE INDEX)

    创建索引是指在某个表的一列或多列上建立一个索引,可以提高对表的访问速度.创建索引对 MySQL 数据库的高效运行来说是很重要的. 基本语法 MySQL 提供了三种创建索引的方法: 1) 使用 CREA ...

  5. mysql按升序创建索引_MySQL 降序索引

    MySQL 降序索引 简介:在本教程中,您将了解MySQL降序索引以及如何利用它来提高查询性能. MySQL降序索引简介 降序索引是以降序存储键值的索引.在MySQL 8.0之前,您可以DESC在索引 ...

  6. mysql按升序创建索引_MySQL中如何使用索引

    原标题:MySQL中如何使用索引 者:Airy 在数据分析之路狂奔,立志成为大咖级人物. 前言 学完基础的MySQL知识,以及MySQL的增删改查,我们要学习一些性能方面的东西.今天来讲一下索引(In ...

  7. mysql按升序创建索引_MySQL8新特性:降序索引详解

    前言 MySQL 8.0终于支持降序索引了.其实,从语法上,MySQL 4就支持了,但正如官方文档所言,"they are parsed but ignored",实际创建的还是升 ...

  8. mysql字符串索引如何排序_MySQL 建立索引的时候如何排序?

    以下回复可能有需要更正的地方 "表引擎在 innodb 的情况下建立 age.sex 的联合索引即可,innodb 会在建立索引时生成 btree 数据结构,这个数据结构上会隐式的加上主键& ...

  9. mysql 创建唯一索引_Mysql普通索引和唯一索引的选择分析

    假设一个用户管理系统,每个人注册都有一个唯一的手机号,而且业务代码已经保证了不会写入两个重复的手机号.如果用户管理系统需要按照手机号查姓名,就会执行类似这样的 SQL 语句: select name ...

最新文章

  1. [20160321]bvi使用问题2.txt
  2. [redis设计与实现][5]基本数据结构——整数集合
  3. 模拟操作系统动态内存管理(c实现)
  4. 《敏捷个人-认识自我、管理自我.pdf》更新至 v0.7
  5. python的全局变量能暂存数据吗_【Python】Python之全局变量
  6. 什么?船开上高架了!
  7. ruby imap抓取inbox中所有邮件的主题
  8. navmenu 收起没有动画 element_ABC360等3家英语动画片课程测评:用动画片学英语不靠谱?...
  9. 面对万人世界军人运动会票务,阿里文娱 Dpath 如何保障稳定性?
  10. windows下ch340 usb转串口芯片的驱动从哪里下载?
  11. HTML+CSS【超浪漫的表白网页代码】不会编程也能制作送给女朋友的表白网站 (1)
  12. JsonView用法
  13. 服务器lsass状态代码c0000005,提示lsass.exe失败状态代码c0000005
  14. elementui实现横向时间轴_element ui step组件在另一侧加时间轴显示
  15. 不小心把桌面进程结束了怎么办_点击任务管理器上的结束进程电脑桌面的图标都 – 手机爱问...
  16. Using Technorati Tags
  17. c# Pdf文件加密和解密
  18. Java通过HAPI解析HL7消息
  19. Matlab计算矩阵频率分布直方图
  20. 计算机程序设计师未来发展,未来的电脑程序设计师作文

热门文章

  1. 阻塞IO与非阻塞IO的区别
  2. 利用NCL和Shell制作动图
  3. mysql更新语句用法_MySQL update 语句的正确用法
  4. 王小波 《沉默的大多数》
  5. 外卖跑腿小程序定制开发功能大全
  6. 良心安利底纹免抠元素素材网站
  7. Code for Rerun DropDownButtonFactory
  8. NDCG原理及代码实现
  9. [乐意黎原创] FTP 产生 gs_tmp_tz.***.** 文件
  10. 李佳琦、薇娅等电商主播为什么迫切开始布局企业微信-私域流量运营?