mysql优化笔记

合集下载

mysql 笔记_02_2013_05_24

mysql 笔记_02_2013_05_24

mysql笔记更新至2012-6-151.如何查看数据表先要选择数据库:use judge然后查看该数据库中有哪些表:show tables查看表的结构:desc student说明:judge是数据库;student是表名。

2.表2.1.查询表mysql中如何查询rownum呢?mysql>set@mycnt=0;Query OK,0rows affected(0.00sec)mysql>select(@mycnt:=@mycnt+1)as ROWNUM,description from question;2.1.1.获取记录的条数st();connections=rs.getRow();2.2.创建表2.2.1.创建自增列:create table student(id int primary key auto_increment,name char(20));注意:自增列必须被定义成一个键(主键或者外键)2.3.删除表drop table student;2.4.修改表2.4.1.增加列alter table pass add column issuperpwd bit(1);2.4.2.删除列alter table student drop column name;2.4.3.修改列的类型alter table student change column name name bit(1);alter table student modify column name bit(2);注意:以上两种方法都可以。

2.4.4.修改列名称修改列的名称alter table student change column name name33char(5);2.4.5.修改表名alter table A rename to B;mysql>alter table A rename to B;Query OK,0rows affected(0.00sec)2.5.约束2.5.1.增加主键alter table student add primary key(id);2.5.2.删除主键alter table student drop primary key;2.5.3.设置自增列alter table student modify column id int auto_increment; mysql>alter table student modify column id int auto_increment; Query OK,0rows affected(0.00sec)Records:0Duplicates:0Warnings:0mysql>desc student;+-------+----------+------+-----+---------+----------------+|Field|Type|Null|Key|Default|Extra|+-------+----------+------+-----+---------+----------------+|id|int(11)|NO|PRI|NULL|auto_increment||name|char(20)|YES||NULL||+-------+----------+------+-----+---------+----------------+2rows in set(0.00sec)2.5.4.去掉自增列alter table student modify column id int;3.备份与还原3.1.备份恢复数据mysqldump-uroot-proot-w"id=2"books book>d:12.sql数据库books中有一个表bookmysqldump-uroot-proot huangwei pass>e:/test/pass.sql说明:huangwei是数据库名,数据库huangwei中有一个表pass mysqldump-uroot-proot-w id=2or id=3books book>d:12.sql备份整个数据库:mysqldump-uroot--password=root--database huangwei>e:/test/huangwei.sql仅备份数据:mysqldump-uroot-proot-t huangwei Question>e:/smb/question.sql说明:-n:不包含数据库的创建语句-t:不包含数据表的创建语句-d:不包含数据3.2.还原执行脚本\./home/whuang/pass.sqlsource d:123\12.sqlsource d:\download\pass_02.sqlmysql-uroot-proot<e:/test/huangwei.sql说明:执行上述命令时,不需要登录数据库4.数据库编码4.1.查看编码show variables like'character\_set\_%';正确的编码是+--------------------------+--------+|Variable_name|Value|+--------------------------+--------+|character_set_client|gbk||character_set_connection|gbk||character_set_database|utf8||character_set_filesystem|binary||character_set_results|gbk||character_set_server|utf8||character_set_system|utf8|+--------------------------+--------+错误的编码是:+--------------------------+--------+|Variable_name|Value|+--------------------------+--------+|character_set_client|gbk||character_set_connection|gbk||character_set_database|latin1||character_set_filesystem|binary||character_set_results|gbk||character_set_server|latin1||character_set_system|utf8|+--------------------------+--------+4.2.设置编码正确default-character-set=utf8错误default-character-set=utf-85.配置5.1.配置文件windows中的配置文件名称是my.inilinux中的配置文件名称是/etc/f配置文件如下:(vim/etc/f)[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql#Default to using old password format for compatibility with mysql3.x#clients(those using the mysqlclient10compatibility package).old_passwords=1#added by huangweidefault-character-set=utf8#Disabling symbolic-links is recommended to prevent assorted security risks; #to do so,uncomment this line:#symbolic-links=0[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid#added by huangwei[mysql]default-character-set=gbkwindows下的配置文件C:\Program Files\MySQL\MySQL Server5.1\my.ini5.1.1.设置自动提交set autocommit=1或set autocommit=on开启自动提交set autocommit=0或set autocommit=off禁止自动提交5.1.2.查看是否是自动提交查看自动提交show variables like'autocommit';select@@autocommit;执行set autocommit=0;完之后再查看:在mysql中设置set autocommit=0后,执行完SQL语句之后,并没有自动提交。

mysqlisnull函数_MySQL优化准则和技巧

mysqlisnull函数_MySQL优化准则和技巧

mysqlisnull函数_MySQL优化准则和技巧MySQL是一种常用的关系型数据库管理系统,它广泛应用于各种Web应用程序和大型企业级系统。

为了提高MySQL数据库的性能和效率,我们可以通过一些优化准则和技巧来优化它的性能。

下面是一些MySQL优化准则和技巧,帮助您提高MySQL数据库的性能和效率。

1.使用合适的数据类型:选择合适的数据类型可以减少存储空间的占用和提高查询效率。

例如,对于存储整数的列,可以使用INT而不是VARCHAR,因为INT类型使用的存储空间更小。

2.创建适当的索引:索引可以加快查询的速度,特别是对于大型表来说。

在选择索引时,应该选择那些经常用于过滤和排序的列。

另外,避免创建过多的索引,因为过多的索引会增加写操作的负担。

3.避免使用SELECT*:尽量避免使用SELECT*语句,因为它会返回所有列的数据,包括不需要的列。

这会增加网络传输的开销和查询的执行时间。

最好只选择需要的列。

4.使用LIMIT分页:对于需要分页的查询,使用LIMIT语句可以提高查询的效率。

LIMIT语句可以限制查询结果的返回行数,减少数据库返回的数据量。

5.使用连接池:连接池可以提高数据库的连接效率。

连接池会维护一组已经建立的数据库连接,这样可以避免每次请求都重新建立连接的开销。

6.避免使用子查询:子查询可能会导致性能问题,特别是在处理大量数据时。

如果可能的话,尽量使用JOIN操作来代替子查询。

7.使用批量插入:当需要插入大量数据时,使用批量插入可以提高插入的效率。

批量插入可以减少与数据库的交互次数,从而提高插入的速度。

8.避免使用SELECTDISTINCT:SELECTDISTINCT语句可以去除查询结果中的重复行,但它会增加查询的开销。

如果不是必要的话,尽量避免使用SELECTDISTINCT。

9.避免在查询中使用函数:在查询中使用函数可以增加查询的开销。

如果可能的话,尽量避免在查询中使用函数。

MySQL数据库中写入性能优化的方法与技巧

MySQL数据库中写入性能优化的方法与技巧

MySQL数据库中写入性能优化的方法与技巧一、简介MySQL是一种常用的关系型数据库管理系统,被广泛应用于各种大型应用中。

而对于很多应用程序来说,数据库的写入性能至关重要。

本文将介绍一些优化MySQL数据库写入性能的方法与技巧。

二、选择合适的存储引擎MySQL提供了多个存储引擎,如InnoDB、MyISAM等。

每个存储引擎都有其特点和适用场景。

在写入密集型的场景下,InnoDB存储引擎通常表现更好。

因为它支持行级锁和事务,可以提供更好的并发性能和数据的一致性。

而对于读多写少的场景,MyISAM存储引擎可能会更适合。

三、使用批量操作在插入大量数据时,采用批量操作比逐条插入更高效。

可以使用LOAD DATA INFILE语句导入CSV或TXT格式的文件,或者使用多值插入语法INSERT INTO table (column1, column2) VALUES (value1, value2), (value1, value2)等。

这样可以减少网络开销和连接开销,提升写入性能。

四、合理设计表结构良好的表结构设计也能提升MySQL数据库的写入性能。

避免使用过多的索引和约束,因为这会增加写入操作的时间。

可以根据具体需求,选择合适的数据类型和字段大小。

此外,将常用的查询字段放在一起,可以减少硬盘I/O,提高查询效率。

五、调整缓存大小MySQL使用了多级缓存来加速查询和写入操作。

其中,InnoDB存储引擎的主要缓存是缓冲池。

通过适当地设置innodb_buffer_pool_size参数,可以调整缓冲池的大小,提升写入性能。

但是也不能设置得过大,因为这会导致内存不足,引发其他性能问题。

六、合理配置日志刷新机制MySQL使用了日志刷新来保证数据的持久性。

但是频繁的日志刷新操作会降低写入性能。

可以通过修改innodb_flush_log_at_trx_commit参数的值,将其设置为合适的数值,来平衡数据安全性和写入性能。

宋红康mysql高级篇笔记

宋红康mysql高级篇笔记

宋红康mysql高级篇笔记MySQL 是一款广泛应用于互联网领域的关系型数据库管理系统。

它的高级功能和优势使得它成为互联网开发者的首选。

本文将分享一些关于 MySQL 高级篇的笔记,涵盖了一些互联网技术介绍、互联网商业和技术应用方面的内容。

一、索引优化索引是提高数据库查询效率的重要手段之一。

在 MySQL 中,使用合适的索引可以显著提升查询性能。

首先,我们需要了解不同类型的索引,如主键索引、唯一索引和普通索引等。

其次,根据具体应用场景,我们可以使用覆盖索引、前缀索引、联合索引等技术进行索引优化。

此外,我们还要注意索引的维护和管理,及时进行索引的重建和优化。

二、查询优化在互联网应用中,查询是最常见的数据库操作之一。

如何编写高效的查询语句,能够快速地获取所需的数据,是每个开发者都应该关注的问题。

本节将介绍一些查询优化的技巧,例如避免使用通配符查询、合理使用 LIMIT 关键字、使用 EXPLAIN 分析查询执行计划等。

三、事务管理事务是保证数据库操作一致性和完整性的重要手段。

MySQL 支持事务的 ACID 特性,可以确保多个操作的原子性、一致性、隔离性和持久性。

本节将详细介绍如何使用事务管理,包括事务的开启、提交和回滚,以及事务并发控制的方法。

四、高级数据操作除了基本的增删改查操作,MySQL 还提供了一些高级数据操作功能,方便开发者完成复杂的数据处理任务。

本节将介绍如何使用子查询、联合查询、分组查询和多表操作等技术,实现更灵活和高效的数据操作。

五、存储引擎选择MySQL 支持多种存储引擎,如 InnoDB、MyISAM、Memory 等。

不同的存储引擎具有不同的特点和适用场景。

本节将比较各种存储引擎的优缺点,并给出存储引擎选择的建议。

六、高可用性和容灾备份在互联网应用中,数据库的高可用性和容灾备份是非常重要的。

本节将介绍如何使用主从复制、读写分离、故障转移和数据备份等技术,提高数据库的稳定性和可用性。

《快速念咒:MySQL入门指南与进阶实战》笔记

《快速念咒:MySQL入门指南与进阶实战》笔记

《快速念咒:MySQL入门指南与进阶实战》阅读记录1. 第一章数据库基础在开始学习MySQL之前,了解一些数据库的基础知识是非常重要的。

数据库是一个用于存储和管理数据的计算机软件系统,它允许用户通过关键字或特定的查询语言来检索、更新和管理数据。

在数据库中,数据是以表格的形式进行组织的,每个表格都包含了一组相关的数据项,这些数据项被称为记录。

表(Table):表是数据库中存储数据的基本单位。

每个表都有一个唯一的名称,并由行(Row)和列(Column)组成。

每一行代表一个数据记录,每一列代表一个特定的数据属性。

字段(Field):字段是表中的一列,代表了数据的一种属性。

每个字段都有一个唯一的名称和一个数据类型,用于定义该字段可以存储的数据种类。

主键(Primary Key):主键是表中的一个特殊字段,用于唯一标识表中的每一行记录。

主键的值必须是唯一的,且不能为NULL。

外键(Foreign Key):外键是一个表中的字段,它的值引用了另一个表的主键值。

外键用于建立两个表之间的联系,确保引用完整性。

索引(Index):索引是一种数据库优化技术,用于提高查询性能。

通过创建索引,数据库可以更快地定位到表中的特定记录,而不必扫描整个表。

SQL(Structured Query Language):SQL是用于与数据库进行交互的编程语言。

它包括用于数据查询、插入、更新和删除的操作符和语法结构。

理解这些基本概念是学习MySQL的前提。

通过掌握SQL语言的基本语法和操作,你将能够有效地管理和操作数据库中的数据。

在接下来的章节中,我们将深入探讨MySQL的具体应用,包括如何创建和管理数据库、表、以及如何执行复杂的查询操作。

2. 第二章数据库设计《快速念咒:MySQL入门指南与进阶实战》是一本全面介绍MySQL 数据库的书籍,其中第二章详细阐述了数据库设计的基础知识和实践技巧。

在这一章节中,作者首先介绍了数据库设计的基本概念和目标,包括数据模型、实体关系模型(ER模型)等,并解释了如何通过这些模型来描述现实世界中的数据和业务逻辑。

(转)MySQL学习笔记-redolog和binlog两阶段提交

(转)MySQL学习笔记-redolog和binlog两阶段提交

(转)MySQL学习笔记-redolog和binlog两阶段提交原⽂:https:///qq_38937634/article/details/113100472?utm_term=mysql%E6%97%A5%E5%BF%97%E4%B8%A4%E9%98%B6%E6%AE%B5%E6%8F%90%E4%BA%A4&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-2-113100472&spm=3001.4430⽂章⽬录MySQL学习笔记-redo log 和 binlog&两阶段提交1.笔记图2.⼀条更新语句是如何被执⾏的3.redo log4.binlog5.为什么要有两份⽇志?6.更新语句内部执⾏流程7.两阶段提交MySQL学习笔记-redo log 和 binlog&两阶段提交前⾯学习了⼀条查询语句的执⾏过程⼀般是经过连接器、分析器、优化器、执⾏器等功能模块,最后到达存储引擎,⽽⼀条更新语句的执⾏流程也会按照查询查询语句的流程⾛⼀遍,但更新语句会涉及到两个⽇志模块,分别是 redo log 和 binlog,这篇⽂章学习⼀下这两个⽇志的作⽤。

1.笔记图2.⼀条更新语句是如何被执⾏的连接器:负责跟客户端建⽴连接、获取权限、维持和管理连接分析器:词法分析:识别出 SQL 语句⾥⾯的字符串分别代表什么,把 SQL 语句中字符串 T 识别成“表名 T,把字符串 ID 识别成列 ID语法分析:根据词法分析的结果,语法分析器会根据语法规则,判断你输⼊的这个 SQL 语句是否满⾜ MySQL 语法优化器:优化器是在表⾥⾯有多个索引的时候,决定使⽤哪个索引,或者在⼀个语句有多表关联(join)的时候,决定各个表的连接顺序执⾏器:调⽤存储引擎提供的接⼝3.redo logWAL(Write-Ahead Logging):先写⽇志,再写磁盘当有记录需要更新时,InnoDB 引擎就会先把记录写到 redo log,并更新内存,这时更新就算完成InnoDB 的 redo log 是固定⼤⼩的,可以配置为⼀组 4 个⽂件,每个⽂件的⼤⼩是 1GB,从头开始写,写到末尾就⼜回到开头循环写Tips:write pos 表⽰当前记录的位置,写到第 3 号⽂件末尾后就回到 0 号⽂件开头,checkpoint 表⽰当前要擦除的位置,擦除记录前要把记录更新到数据⽂件如果 write pos 追上 checkpoint,表⽰ redo log 满了,这时不能再执⾏新的更新,得停下来先擦掉⼀些记录,把 checkpoint 推进⼀下crash-safe:InnoDB 就可以保证即使数据库发⽣异常重启,之前提交的记录都不会丢失4.binlogMySQL Server 层也有⾃⼰的⽇志,称为归档⽇志(binlog),binlog ⽇志只能⽤于归档redo log 是 InnoDB 引擎特有的,binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使⽤redo log 是物理⽇志,记录的是在某个数据页上做了什么修改,binlog 是逻辑⽇志,记录的是这个语句的原始逻辑,⽐如给 ID=2 这⼀⾏的 c 字段加 1redo log 是循环写的,空间固定会⽤完,binlog 是可以追加写⼊的,binlog ⽂件写到⼀定⼤⼩后会切换到下⼀个,并不会覆盖以前的⽇志5.为什么要有两份⽇志?最开始 MySQL ⾥并没有 InnoDB 引擎,MyISAM 没有 crash-safe 的能⼒,binlog ⽇志只能⽤于归档InnoDB 是另⼀个公司以插件形式引⼊ MySQL 的,使⽤另外⼀套⽇志系统 redo log 来实现 crash-safe 能⼒6.更新语句内部执⾏流程update T set c=c+1 where ID=2执⾏器先找引擎取 ID=2 这⼀⾏,ID 是主键,引擎直接⽤树搜索找到这⼀⾏,如果 ID=2 这⼀⾏所在的数据页本来就在内存中,就直接返回给执⾏器,否则,需要先从磁盘读⼊内存,然后再返回执⾏器拿到引擎给的⾏数据,把这个值加上 1,⽐如原来是 N,现在就是 N+1,得到新的⼀⾏数据,再调⽤引擎接⼝写⼊这⾏新数据引擎将这⾏新数据更新到内存中,同时将这个更新操作记录到 redo log ⾥⾯,此时 redo log 处于 prepare 状态。

mysql学习笔记(一)之mysqlparameter

mysql学习笔记(一)之mysqlparameter

mysql学习笔记(⼀)之mysqlparameter基础琐碎总结-----参数化查询参数化查询(Parameterized Query )是指在设计与数据库链接并访问数据时,在需要填⼊数值或数据的地⽅,使⽤参数 (Parameter) 来给值,这个⽅法⽬前已被视为最有效可预防SQL注⼊攻击 (SQL Injection) 的攻击⼿法的防御⽅式。

下⾯将重点总结下Parameter构建的⼏种常⽤⽅法。

说起参数化查询当然最主要的就是如何构造所谓的参数:⽐如,我们登陆时需要密码和⽤户名,⼀般我们会这样写sql语句,Select * from Login where username= @Username and password = @Password,为了防⽌sql注⼊,我们该如何构建@Username和@Password两个参数呢,下⾯提供六种(其实⼤部分原理都是⼀样,只不过代码表现形式不⼀样,以此仅作对⽐,⽅便使⽤)构建参数的⽅法,根据不同的情况选⽤合适的⽅法即可:说明:以下loginId和loginPwd是户登陆时输⼊登陆⽤户名和密码,DB.conn是数据库连接,⽤时引⼊using System.Data.SqlClient命名空间⽅法⼀:SqlCommand command = new SqlCommand(sqlStr, DB.conn);command.Parameters.Add("@Username", SqlDbType.VarChar);command.Parameters.Add("@Pasword", SqlDbType.VarChar);command.Parameters["@Username"].Value = loginId;command.Parameters["@Pasword"].Value = loginPwd;⽅法⼆:SqlCommand command = new SqlCommand();command.Connection = DB.conn;mandText = sqlStr;command.Parameters.Add(new SqlParameter("@Username", loginId));command.Parameters.Add(new SqlParameter("@Pasword", loginPwd));⽅法三:Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn);cmd.parameters.add("@Username",DbType.varchar).value=loginId;cmd.parameters.add("@Pasword",DbType.varchar).value=loginPwd;⽅法四:Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn);cmd.parameters.addwithvalue("@Username",loginId);cmd.parameters.addwithvalue("@Pasword",loginPwd);⽅法五:Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn);SqlParameter para1=new SqlParameter("@Username",SqlDbType.VarChar,16);para1.Value=loginId;cmd.Parameters.Add(para1);SqlParameter para2=new SqlParameter("@Pasword",SqlDbType.VarChar,16);para2.Value=loginPwd;cmd.Parameters.Add(para2);⽅法六:SqlParameter[] parms = new SqlParameter[]{new SqlParameter("@Username", SqlDbType.NVarChar,20),new SqlParameter("@Pasword", SqlDbType.NVarChar,20),};SqlCommand cmd = new SqlCommand(sqlStr, DB.conn);// 依次给参数赋值parms[0].Value = loginId;parms[1].Value = loginPwd;//将参数添加到SqlCommand命令中foreach (SqlParameter parm in parms){cmd.Parameters.Add(parm);}法和实现⽅法的不同,也可以说是语法糖,但后记:鉴于园友对dedeyi,⿁⽕飘荡,guihwu的疑问,我在写⼀个说明。

Mysql笔记(附Mysql基础书pdf版)

Mysql笔记(附Mysql基础书pdf版)

Mysql笔记(附Mysql基础书pdf版)资料数据库篇SHOW DATABASES; //显⽰数据库系统中已经存在的数据库CREATE DATABASE 数据库名; //创建数据库DROP DATABASE 数据库名; //删除数据库表篇注:在使⽤操作表语句前,⾸先要使⽤USE语句选择数据库。

选择数据库语句的基本格式为“USE 数据库名”。

否则会报错,1046;CREATE TABLE 表名 ( 属性名数据类型 [完整性约束条件],属性名数据类型 [完整性约束条件],属性名数据类型);表名不能为SQL语句的关键字,⼀个表可以有多个属性。

定义时,字母⼤⼩写均可,各属性之间⽤逗号隔开,最后⼀个属性不需要加逗号。

主键主键有唯⼀值单字段主键属性名数据类型 primary key //创建主键,写在属性名数据类型后⾯;多字段主键primary key(属性名 1,属性名2,属性名n)两者的组合可以确定唯⼀的⼀条记录;外键外键不⼀定必须为⽗表的主键,但必须是唯⼀性索引,主键约束和唯⼀性约束都是唯⼀性索引;外键可以为空值;设置外键的基本语法规则如下:CONSTRAINT 外键别名 FOREIGN KEY(属性 1.1,属性1.2,属性1.n)REFERENCES 表名(属性2.1,属性2.2,属性2.n)其中,“外键别名”参数是为外键的代号;“属性1”参数列表是⼦表中设置的外键;“表名”参数是指⽗表的名称;“属性2”参数列表是⽗表的主键。

设置表的⾮空约束设置表的唯⼀性约束设置表的属性值⾃动增加查看表结构DESCRIBE 表名; // 查看表基本结构语句,可缩写为desc 表名SHOW CREATE TABLE 表名; //查看表详细结构语句(包含存储引擎、字符编码)删除表DROP TABLE 表名;//删除没有被关联的普通表删除⽗表需要先将外键删除,然后才能去删除⽗表。

字段篇//通过ALTER TABLE语句ALTER TABLE 旧表名 RENAME [TO] 新表名;//修改表名 TO参数是可选参数,是否在语句中出现不会影响语句的执⾏。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

◆Mysql数据库的优化技术<大型网站优化技术>对mysql优化时一个综合性的技术,主要包括a: 表的设计合理化(符合3NF)b: 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]c: 分表技术(水平分割、垂直分割)d: 读写[写: update/delete/add]分离e: 存储过程[模块化编程,可以提高速度] 数据库的三层结构:f: 对mysql配置优化[配置最大并发数my.ini, 调整缓存大小]g: mysql服务器硬件升级h: 定时的去清除不需要的数据,定时进行碎片整理(MyISAM)CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name[USING index_type]ON tbl_name (index_col_name,...)◆什么样的表才是符合3NF (范式)表的范式,是首先符合1NF, 才能满足2NF , 进一步满足3NF1NF: 即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只有数据库是关系型数据库(mysql/oracle/db2/informix/sysbase/sql server),就自动的满足1NF☞数据库的分类关系型数据库: mysql/oracle/db2/informix/sysbase/sql server非关系型数据库: (特点: 面向对象或者集合)NoSql数据库: MongoDB(特点是面向文档)2NF: 表中的记录是唯一的, 就满足2NF, 通常我们设计一个主键来实现id primary key ;3NF: 即表中不要有冗余数据, 就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放. 比如下面的设计就是不满足3NF:显示推导处理反3NF : 但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。

具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。

降低范式就是增加字段,允许冗余。

案例:Sql语句本身的优化问题是:如何从一个大项目中,迅速的定位执行速度慢的语句. (定位慢查询)①首先我们了解mysql数据库的一些运行状态如何查询(比如想知道当前mysql运行的时间/一共执行了多少次select/update/delete.. / 当前连接)show status常用的:show status like …uptime‟ ;show stauts like …com_select‟show stauts like …com_insert‟ ...类推update delete☞show [session|global] status like .... 如果你不写[session|global] 默认是session 会话,指取出当前窗口的执行,如果你想看所有(从mysql 启动到现在,则应该global)show status like …connections‟;//显示慢查询次数show status like …slow_queries‟;②如何去定位慢查询构建一个大表(400 万)-> 存储过程构建默认情况下,mysql认为10秒才是一个慢查询.修改mysql的慢查询.show variables like …long_query_time‟ ; //可以显示当前慢查询时间set long_query_time=1 ;//可以修改慢查询时间构建大表->大表中记录有要求, 记录是不同才有用,否则测试效果和真实的相差大.创建:CREATE TABLE dept( /*部门表*/deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*编号*/dname V ARCHAR(20) NOT NULL DEFAULT "", /*名称*/loc V ARCHAR(13) NOT NULL DEFAULT "" /*地点*/) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;CREATE TABLE emp(empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*编号*/ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/job V ARCHAR(9) NOT NULL DEFAULT "",/*工作*/mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上级编号*/hiredate DATE NOT NULL,/*入职时间*/sal DECIMAL(7,2) NOT NULL,/*薪水*/comm DECIMAL(7,2) NOT NULL,/*红利*/deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/)ENGINE=MyISAM DEFAULT CHARSET=utf8 ;CREATE TABLE salgrade(grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,losal DECIMAL(17,2) NOT NULL,hisal DECIMAL(17,2) NOT NULL)ENGINE=MyISAM DEFAULT CHARSET=utf8;测试数据INSERT INTO salgrade V ALUES (1,700,1200);INSERT INTO salgrade V ALUES (2,1201,1400);INSERT INTO salgrade V ALUES (3,1401,2000);INSERT INTO salgrade V ALUES (4,2001,3000);INSERT INTO salgrade V ALUES (5,3001,9999);为了存储过程能够正常执行,我们需要把命令执行结束符修改delimiter $$create function rand_string(n INT)returns varchar(255) #该函数会返回一个字符串begin#chars_str定义一个变量chars_str,类型是varchar(100),默认值'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';declare chars_str varchar(100) default'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';declare return_str varchar(255) default '';declare i int default 0;while i < n doset return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1));set i = i + 1;end while;return return_str;end $$如果希望在程序中使用,是Ok!创建一个存储过程create procedure insert_emp(in start int(10),in max_num int(10))begindeclare i int default 0;#set autocommit =0 把autocommit设置成0set autocommit = 0;repeatset i = i + 1;insert into emp values ((start+i) ,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());until i = max_numend repeat;commit;end $$#调用刚刚写好的函数, 1800000条记录,从100001号开始call insert_emp(100001,4000000);③这时我们如果出现一条语句执行时间超过1秒中,就会统计到.④如果把慢查询的sql记录到我们的一个日志中在默认情况下,我们的mysql不会记录慢查询,需要在启动mysql时候,指定记录慢查询才可以bin\mysqld.exe - -safe-mode - -slow-query-log [mysql5.5 可以在my.ini指定]bin\mysqld.exe –log-slow-queries=d:/abc.log [低版本mysql5.0可以在my.ini指定]先关闭mysql,再启动, 如果启用了慢查询日志,默认把这个文件放在my.ini 文件中记录的位置#Path to the database rootdatadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"⑤测试,可以看到在日志中就记录下我们的mysql慢sql语句.优化问题.通过explain 语句可以分析,mysql如何执行你的sql语句, 这个工具的使用放一下,一会说.添加索引【小建议: 】四种索引(主键索引/唯一索引/全文索引/普通索引)1.添加1.1主键索引添加当一张表,把某个列设为主键的时候,则该列就是主键索引create table aaa(id int unsigned primary key auto_increment ,name varchar(32) not null defaul …‟);这是id 列就是主键索引.如果你创建表时,没有指定主键索引,也可以在创建表后,在添加, 指令:alter table 表名add primary key (列名);举例:create table bbb (id int , name varchar(32) not null default …‟);alter table bbb add primary key (id);1.2普通索引一般来说,普通索引的创建,是先创建表,然后在创建普通索引比如:create table ccc(id int unsigned,name varchar(32))create index 索引名on 表(列1,列名2);1.3创建全文索引全文索引,主要是针对对文件,文本的检索, 比如文章, 全文索引针对MyISAM有用.创建:CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,title VARCHAR(200),body TEXT,FULLTEXT (title,body))engine=myisam charset utf8;INSERT INTO articles (title,body) V ALUES('MySQL Tutorial','DBMS stands for DataBase ...'),('How To Use MySQL Well','After you went through a ...'),('Optimizing MySQL','In this tutorial we will show ...'),('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),('MySQL vs. YourSQL','In the following database comparison ...'),('MySQL Security','When configured properly, MySQL ...');如何使用全文索引:错误用法:select * from articles where body like …%mysql%‟; 【不会使用到全文索引】证明:explain select * from articles where body like …%mysql%‟正确的用法是:select * from articles where match(title,body) against(…database‟); 【可以】☞说明:1.在mysql中fulltext 索引只针对myisam生效2.mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文3.使用方法是match(字段名..) against(…关键字‟)4.全文索引一个叫停止词, 因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建,这些词,称为停止词.1.4唯一索引①当表的某列被指定为unique约束时,这列就是一个唯一索引create table ddd(id int primary key auto_increment , name varchar(32) unique);这时, name 列就是一个唯一索引.unique字段可以为NULL,并可以有多NULL, 但是如果是具体内容,则不能重复. 主键字段,不能为NULL,也不能重复.②在创建表后,再去创建唯一索引create table eee(id int primary key auto_increment, name varchar(32));create unique index 索引名on 表名(列表..);2.查询索引desc 表名【该方法的缺点是:不能够显示索引名.】show index(es) from 表名show keys from 表名3.删除alter table 表名drop index 索引名;如果删除主键索引。

相关文档
最新文档