mysql 建表时建立索引_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)。

备注

主键的命名采用如下规则:

主键名用pk_开头,后面跟该主键所在的表名。主键名长度不能超过30个字符。如果过长,可对表名进行缩写。缩写规则同表名的缩写规则。主键名用小写的英文单词来表示。

外键的命名采用如下规则:

外键名用fk_开头,后面跟该外键所在的表名和对应的主表名(不含t_)。子表名和父表名自己用下划线(_)分隔。外键名长度不能超过30个字符。如果过长,可对表名进行缩写。缩写规则同表名的缩写规则。外键名用小写的英文单词来表示。

索引的命名采用如下规则:

1)索引名用小写的英文字母和数字表示。索引名的长度不能超过30个字符。

2)主键对应的索引和主键同名。

3)唯一性索引用uni_开头,后面跟表名。一般性索引用ind_开头,后面跟表名。

4)如果索引长度过长,可对表名进行缩写。缩写规则同表名的缩写规则

index 相关语法

CREATE INDEX log_url ON logaudit_log(url);

show index from logaudit_log

drop index log_request_time on logaudit_log

sql执行效率检测 mysql explain

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

使用方法,在select语句前加上explain就可以了:

如:explain select surname,first_name form a,b where a.id=b.id

分析结果形式如下:

table |  type | possible_keys | key | key_len  | ref | rows | Extra

EXPLAIN列的解释:

table

显示这一行的数据是关于哪张表的

type

这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL

possible_keys

显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key

实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE

INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引

key_len

使用的索引的长度。在不损失精确性的情况下,长度越短越好

ref

显示索引的哪一列被使用了,如果可能的话,是一个常数

rows

MYSQL认为必须检查的用来返回请求数据的行数

Extra

关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢

extra列返回的描述的意义

Distinct

一旦MYSQL找到了与行相联合匹配的行,就不再搜索了

Not exists

MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,

就不再搜索了

Range checked for each

Record(index map:#)

没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一

Using filesort

看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行

Using index

列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候

Using temporary

看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上

Where used

使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题

不同连接类型的解释(按照效率高低的顺序排序)

system

表只有一行:system表。这是const连接类型的特殊情况

const

表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待

eq_ref

在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用

ref

这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好

range

这个连接类型使用索引返回一个范围中的行,比如使用>或

FAQ

1

表中包含 10 万条记录,有一个 datetime 类型的字段。

取数据的语句:

SELECT * FROM my_table WHERE created_at < '2010-01-20';

用 EXPLAIN 检查,发现 type 是 ALL, key 是 NULL,根本没用上索引。

可以确定的是,created_at 字段设定索引了。

什么原因呢?

用 SELECT COUNT(*) 看了一下符合 WHERE 条件的记录总数,居然是 6W 多条!!

难怪不用索引,这时用索引毫无意义,就好像 10 万条记录的用户表,有个性别字段,不是男就是女,在这种字段设置索引是错误的决定。

稍微改造一下上述语句:

SELECT * FROM my_table WHERE created_at BETWEEN '2009-12-06' AND '2010-01-20';

这回问题解决!

符合条件的记录只有几百条,EXPLAIN 的 type 是 range,key 是 created_at,Extra 是 Using where 。

自己总结个准则,索引的目的就是尽量缩小结果集,这样才能做到快速查询。

6万条记录符合条件,已经超出总记录数的一半,这时索引已经没有意义了,因此 MySQL 放弃使用索引。

这与设置 gender 字段,并加上索引的情况相似,当你要把所有男性记录都选取出来,符合条件的记录数约占总数的一半,MySQL 同样不会使用这个索引。

唯一值越多的字段,使用索引的效果越好。

设置联合索引时,唯一值越多的,越应该放在“左侧”。

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

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

相关文章

有关于mysql自增型需要返回id_关于mysql自增id,你需要知道的

关于mysql自增id&#xff0c;你需要知道的,主键,重启,索引,类型,字段关于mysql自增id&#xff0c;你需要知道的易采站长站&#xff0c;站长之家为您整理了关于mysql自增id&#xff0c;你需要知道的的相关内容。导读&#xff1a;在使用MySQL建表时&#xff0c;我们通常会创建一个…

python 调用不存在的方法 统一处理_提取不重复数据在Excel、SQL与Python中的处理方法...

村长今天跟大家简单分享一下如何在Excel、SQL和Python中用不同的方法提取不重复值(数据去重)。一、Excel1.1、函数法(数组公式)函数公式&#xff1a;IFERROR(INDEX(A:A,SMALL(IF(MATCH($A$2:$A$16,$A$2:$A$16,0)ROW($1:$15),ROW($2:$16),9^9),ROW(A1))),"")1.2、技巧…

友盟渠道统计mysql_cnzz友盟怎么安装网站统计代码监控网站流量

GC算法http://www.brpreiss.com/books/opus5/html/page424.html http://www.brpreiss.com/books/opus5/html/page4 ...python 定时任务Python 定时任务 最近学习到了 python 中两种开启定时任务的方法,和大家分享一下心得. sched.scheduler() threading.Timer() sched 定时任务…

rpm安装mysql5.5_CentOS下以RPM方式安装MySQL5.5

1、查找以前是否装有mysql命令&#xff1a;rpm -qa|grep -i mysql可以看到mysql的两个包&#xff1a;mysql-4.1.12-3.RHEL4.1mysqlclient10-3.23.58-4.RHEL4.12、删除mysql删除命令&#xff1a;rpm -e --nodeps 包名( rpm -ev mysql-4.1.12-3.RHEL4.1 )3、删除老版本mysql的开发…

tensorflow是python自带的吗_python-Tensorflow-没有名为’_pywrap_tensorflow_int...

目前,我正在尝试使tensorflow-我的PC上运行Windows 64位(仅cpu版本).运行命令python object_detection / builders / model_builder_test.py时出现以下错误.我在网上搜索,有99&#xff05;的答案是使用cd,我认为我已经尝试过了,但是那没用.我之所以说“我认为”,是因为我不知道…

python爬取多页数据_python爬虫实现爬取同一个网站的多页数据代码实例

本篇文章小编给大家分享一下python爬虫实现爬取同一个网站的多页数据代码实例&#xff0c;文章代码介绍的很详细&#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家供大家参考&#xff0c;有需要的小伙伴们可以来看看。一、爬虫的目的从网上获取对你有需要的数据二、爬虫…

python调用百度语音实时转为文字_百度语音转文字 (Python)

感受好久没写中文技术文章了。说实话&#xff0c;学东西都是基于英文&#xff0c;或者 别人从英文翻译成中文 咱们再捡二手货学习。因此用中文写技术文章怎么都感受是在骗人&#xff0c;怎么都以为很别扭。编程可是这一次的主角是百度。框架虽然认真来说&#xff0c;全部编程语…

yum安装mysql5.7 简书_阿里云服务器(centos7.3)上安装jdk、tomcat、mysql、redis

前言:平时我们敲的项目&#xff0c;只能在本地浏览&#xff0c;不论项目写得怎么样只有自己看得到&#xff0c;只有发布到了云服务器&#xff0c;别人才能访问得到。学习之路就是这样&#xff0c;当别人能访问自己的项目时&#xff0c;会更有成就感&#xff0c;所以接下来就一起…

卸载源码安装mysql_CentOS7下源码安装MySQL5.7.6+

卸载CentOS7默认携带的mariadb包# 检查mariadb安装包[rootwing ~]# rpm -qa | grep -i mysql[rootwing ~]# rpm -qa | grep -i mariadbmariadb-libs-5.5.50-1.el7_2.x86_64# 卸载mariadb安装包[rootwing ~]# rpm -e mariadb-libs-5.5.50-1.el7_2.x86_64error: Failed dependenc…

android paint 线宽_android Paint 设置线宽setStrokeWidth()的单位

首先画一个空心的矩形框&#xff0c;代码如下&#xff1a;public class MainActivity extends Activity {Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ImageView image (ImageView…

python绘制四边螺旋线代_解决python彩色螺旋线绘制引发的问题

彩色螺旋线的绘制代码如下&#xff1a;import turtleimport timeturtle.pensize(2)turtle.bgcolor(black)colors [red, yellow, purple, blue]turtle.tracer(False)for x in range(400):turtle.forward(2*x)turtle.color(colors[x % 4])turtle.left(91)turtle.tracer(True)tim…

java的excel导出_java 实现excel 导出功能

1 //导出数据2 //SELECT SUBSTRING(create_time,1,10) s,COUNT(*) FROM data_read WHERE data_id IN (SELECT data_id FROM DATA WHERE model_id2 OR model_id27) GROUP BY s3 RequestMapping(params "methodoutData",method RequestMethod.GET)4 public voidoutCom…

java如何让线程阻塞_Java中如何使一个线程进入阻塞态?

按我的理解&#xff0c;当一个线程需要获取的锁被另一个线程占用时&#xff0c;将进入阻塞态。但实际好像不是这样的&#xff0c;下面是我的代码。在run方法中会调用MyBlock的isBlocked方法&#xff0c;该方法添加了synchronized限定。在main方法中创建两个线程&#xff1a;t1和…

java监听焦点事件_【Java Swing公开课|Java Swing焦点事件监听器怎么用,看完这篇文章你一定就会了】- 环球网校...

【摘要】作为一门面向对象编程语言&#xff0c;Java吸收了C语言的优点&#xff0c;也展现了其强大的一面&#xff0c;我们能在各个地方看到其功能强大和简单易用的两个特征&#xff0c;当然&#xff0c;也吸引了很多程序员的注意力&#xff0c;所以就有人想了解Java的相关内容&…

idea创建java项目目录结构_用IDEA创建一个简单的Maven的JavaWeb项目

1.项目环境IDEA&#xff1a;2016.2JDK&#xff1a;1.8.0_76Maven&#xff1a;3.2.52.File-->New-->Project-->Maven3.选择Project SDK&#xff1a;1.8&#xff0c;然后勾选下方的Create from archetype&#xff0c;选择maven archetype webapp&#xff0c;点击Next4.填…

java min 函数的使用方法_【Python】Java程序员学习Python(五)— 函数的定义和使用...

不想做一个待宰的羔羊&#xff01;&#xff01;&#xff01;&#xff01;要自己变得强大。。。。函数的定义和使用放在最前边还是有原因的&#xff0c;现在语言趋于通用&#xff0c;基本类型基本都是那些&#xff0c;重点还是学习对象的使用方法&#xff0c;而最根本的还是方法…

java 斜率求角度_计算两条线之间的角度而不必计算斜率? (Java)

我有两条线&#xff1a;L1和L2。我想计算两条线之间的角度。 L1具有点&#xff1a;{(x1&#xff0c;y1)&#xff0c;(x2&#xff0c;y2)}和L2具有点&#xff1a;{(x3&#xff0c;y3)&#xff0c;(x4&#xff0c;y4)}。如何计算这两条线之间形成的角度&#xff0c;而不必计算斜率…

java runtime类 heap_Java 进阶(一) JVM运行时内存模型

1.JVM运行时数据区域的划分a.程序计数器(Program Counter Register)一块较小的内存空间&#xff0c;可以看作是当前线程所执行的字节码的行号指示器。每个线程拥有独立的一个计数器&#xff0c;如果当前执行的是Native方法&#xff0c;则计数器值为空。b.JVM栈(Java Virtual Ma…

jmeter java性能_jmeter java性能测试

本篇文章主要讲解jmeter如何测试java请求&#xff0c;以项目中某个接口为例&#xff0c;请求数据为post&#xff0c;返回也为post1&#xff1a;新建maven工程&#xff0c;pom文件为1 2 xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd…

mysql 换服务器_更换MYSQL后数据库连接问题

【IT168 服务器学院】查看MYSQL数据库中 数据库与用户的连接方式>mysql -uroot -ppassword>use mysql;>select User,host,Password from user;问题&#xff1a;将备份的MYSQL数据库CP回DATA下后&#xff0c;老是连接数据库出错&#xff0c;或是提示UPDATE之类&#xf…