- 浏览: 403475 次
- 性别:
- 来自: 昆明
-
文章分类
- 全部博客 (198)
- java (28)
- J2EE (19)
- struts (33)
- sping (13)
- hibernate (18)
- mybatis (15)
- connection pool (3)
- DB (26)
- SQL (21)
- html (13)
- js (7)
- json (3)
- jquery (2)
- document (17)
- linux (15)
- C# (1)
- url (2)
- eweb4j (1)
- Turbine (1)
- 框架 (11)
- jdbcTemplate (3)
- aop (2)
- windows (2)
- ubuntu (1)
- eclipse (11)
- JPA (8)
- svn (4)
- get 传值 (2)
- mysql (5)
- oracle (2)
- hadoop (1)
- MongoDB (2)
- spring (1)
- python (1)
最新评论
-
jcbingjc:
楼主,你好,按照上面的配置,我报如下错误:Missing Pe ...
[properJavaRDP]在网页中实现远程连接 -
sucful:
折腾了半天跑不通 ,要传就搞个完整的吧
Struts2 <sx:div/>实现页面模块异步刷新 -
Kattou:
你好! 看了你写的这个分页 感觉很好, 但是不怎么会用么,请指 ...
jsp分页控件 -
我叫PSB:
地址完全用不了
eclipse中的安装 jseclipse -
1111emotion:
我的工程里还是有乱码的情况,我该改的地方都改了。
Eclipse/MyEclipse更改默认字符集 设置UTF-8
一、 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
转自:http://www.phpweblog.net/richard-dong/archive/2008/12/15/6173.aspx
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 同样不会使用这个索引。
唯一值越多的字段,使用索引的效果越好。
设置联合索引时,唯一值越多的,越应该放在“左侧”。
发表评论
-
SQL匹配度查询
2017-07-18 15:46 1865SELECT (IF(LOCATE('RK', SJXBSF ... -
MariaDB导出导入命令
2017-02-07 09:44 2131导出: mysqldump -h127.0.0.1 -P3 ... -
MySQL 5.7 使用原生JSON类型的例子
2016-12-17 18:13 1414首先回顾一下JSON的语法规则: 数据在键值对中, 数据 ... -
MySQL5.7 配置说明Windows
2016-12-17 18:12 594一、配置文件my.ini的位置 隐藏文件夹:C:\Prog ... -
Oracle建立表空间和用户
2016-06-24 11:30 568Oracle建立表空间和用户 ... -
oracle数据库导入导出命令
2016-06-24 11:01 746Oracle数据导入导出imp ... -
oracle记录
2014-02-21 17:27 88437 oracle记录 create tab ... -
sql优化 mysql优化 检索效率注意20项
2012-07-03 11:19 21441、通配符尽量避免2 ... -
Mysql索引优化
2012-07-02 13:38 1130为什么使用索引 提高查询效率 降低数据排序成分 - - ... -
mysql与mssql的区别
2012-07-02 11:01 2053对于程序开发人员而言 ... -
SQL字符串处理函数大全
2012-04-19 09:36 990select语句中只能使用sql函数对字段进行操作(链接s ... -
Mysql中创建用户帐户的方法
2011-11-16 00:06 11851.CREATE USER CREATE USER ... -
Linux下安装MYSQL 5.0 应该对mysql进行必要设置
2011-11-06 10:52 12691、下载MySQL的安装文件 安 ... -
mysql数据库自动备份与恢复
2011-11-07 12:07 1396创建目录/home/zf/mysqlBack/#添加以下 ... -
mysql基本命令总结
2011-11-07 12:08 1124数据库asb 表yg 一.mysql的常用命 ... -
MySQL中show 句法得到表列及整个库的详细信息(精品珍藏)
2011-11-07 12:08 1064show databases;show tables ... -
MSSQL服务器/数据库角色说明
2011-11-08 08:07 1491七种常用固定服务器角色 系统管理员:拥有SQL SE ... -
MYSQL设置远程用户连接
2011-11-15 08:48 966011年05月21日 星期六 13时25分16秒MySQL安装 ... -
MySQL 用户权限分配 Grant 语法详解
2011-11-16 00:07 2429MySQL 赋予用户权限命令的简单格式可概括为: g ... -
SQL LIKE 通配符的用法
2011-11-18 10:01 1745_ 与任意单字符匹配 % 与包含一个或多个 ...
相关推荐
MySQL数据库在设计和优化中,建表和索引的使用规范是至关重要的,它们直接影响到数据存储的效率和查询性能。以下是对这些规范的详细解释: 1. **字段设置**: - **非空约束**:在创建表时,推荐为字段设置非空约束...
通过遵循以上建表规范、SQL规范及索引规范,可以帮助数据库管理员和开发人员更高效地进行数据库设计、SQL语句编写及索引优化,从而提升数据库的整体性能和可维护性。这些规范不仅有助于确保数据库的稳定运行,还能...
oracle向mysql建表语句的迁移。 直接表结构的生成sql脚本
标题中的“Excel生成MYSQL建表语句”是指利用JAVA编程技术,通过读取预先设计好的Excel模板,自动生成对应的MySQL数据库建表语句的过程。这个过程通常涉及到数据处理、文件读写以及数据库操作等核心技能。 首先,让...
MySQL 表和索引优化实战 MySQL 表和索引优化实战是指在 MySQL 数据库中对表和索引进行优化,以提高查询效率和存储空间利用率。本文将从 MySQL 表和索引的基本概念出发,探讨 MySQL 表和索引优化的实战经验和技巧。...
MySql建表脚本语句--商店示例
在Java开发中,将Java实体类转换为MySQL数据库的建表语句是一项常见的任务,它有助于快速构建数据库模型,尤其在使用ORM(对象关系映射)框架如Hibernate、MyBatis时更为便捷。本篇文章将深入探讨这个过程,并提供...
在本部分内容中,重点介绍了NULL和NOT NULL修饰符的使用和区别。在MySQL中,NULL意味着该字段可以没有值,即空值;而NOT NULL修饰的字段则必须在插入记录时给出值,不能为NULL。对于NOT NULL字段的效率之所以比NULL...
下面我们将详细介绍 MySql 建表规范和示例建表。 一、关系型数据库 关系型数据库是指通过主外键联系在一起的多个表。这些表之间存在逻辑关系,合并在一起形成一个整体。在关系型数据库中,一对一、一对多和多对多是...
在这个场景中,“kettle批量导出mysql建表语句”是一个关于如何使用Kettle来自动化地从MySQL数据库中提取建表语句,包括数据表和视图的创建语句,以便于备份或在其他环境中重建相同结构的过程。 首先,我们需要了解...
MySQL 高级 - 索引 - 优势和劣势 P5 day01-06. MySQL 高级 - 索引 - 数据结构 P6 day01-07. MySQL 高级 - 索引 - 数据结构 - BTREE P7 day01-08. MySQL 高级 - 索引 - 数据结构 - B+TREE P8 day01-09. MySQL 高级 -...
mysql驱动包 mysql-connector-java-5.1.13-bin.jar 方便快捷获取。。。
activity mysql 建表语句 23张表 oracle数据库脚本的改版
下面,我们将详细讨论MySQL建表和插入数据的相关知识点。 首先,我们来看“建表代码.txt”。在MySQL中,创建表格(即建表)是通过`CREATE TABLE`语句实现的。这个语句允许指定表格的名称、列名以及每列的数据类型。...
6. **连接池**:在实际应用中,为了优化性能和资源利用,通常会使用连接池(如C3P0、HikariCP等),这需要在配置连接池时引入`mysql-connector-java-5.1.27.jar`。 7. **版本兼容性**:`5.1.27`版本的驱动适用于...
综上所述,“mysql建表语句.zip”中的内容可能涵盖了如何为大数据环境设计高效的 MySQL 表结构,包括但不限于字段定义、主键和索引的设置、数据分区策略等。这些知识点对于千亿级数仓项目的实施至关重要,确保数据的...
mysql建表工具-自动生成建表语句
总之,MySQL for Visual Studio 1.2.6 和 mysql-connector-net-6.9.9 是C#开发者在Visual Studio 2015环境下高效开发与MySQL数据库交互的应用的重要工具,它们提供了完整的数据库管理、代码生成和调试功能,极大地...
3. **字段一致性**:不同表间相同属性的字段,如类型、长度、非空性和默认值,应保持一致,有利于索引的使用和维护。 4. **单个索引使用**:一条SQL语句只能使用一个表的一个索引。这意味着在优化查询时,应考虑...