mysql学习笔记

合集下载

MySQL个人学习笔记

MySQL个人学习笔记

MySQL个人学习笔记一、mysql常见的数据类型:int(8) 整形,float(5,1) 浮点型,规定插入的值不超过5位数字,小数点后面带两位数字且小数点超出后会四舍五入,double(5,2)一样是浮点型decimal(5,2) 一样是浮点型。

char(8)字符型,varchar(8)可变字符型。

date,values(‘2014-04-23’)或(20104423)time,values(‘12:30:50’)或(123050)year,values(2014)datetime,values(‘1993-03-12 12:30:12‘)或(012)null 类型。

表示什么都没有。

null 不等于 ' ' ~~~。

二、mysql常见的运算符:+、-、*、/、%、<,>,=,>=,<=,!=,<=>(用于安全等于null值。

no <=> null)NOT 或 !,AND 或 && ,OR 或 ||,三、mysql常见的函数:ABS(X)返回x的绝对值。

CURDATE() 返回当前的日期 2014-04-23CURTIME() 返回当前的时间 19:17:13NOW() 返回当前的日期和时间 2014-04-23 19:17:48聚合函数:AVG(COLUME) 求该列的平均值, COUNT(COL) 计算列中非null的行数,MIN(COL)求该列的最小值,MAX(COL) 求该列的最大值,SUM(COL) 求该列值的和,COUNT(*) 计算表中所有的行数,包括null值。

四、数据库和表:1、创建数据库。

create database db1; 或着 create databse if not exists db1;2、选择需要的数据库。

use db1;3、删除数据库。

drop database db1; 或者 drop databse if exists db1;4、创建表:create table table_name (name char(2),id int(2),....)type=xxxx;4.1 字段约束:首先 null 不等于 ' 'null:当某列的约束为null时,该字段的值可以插入null,表示没有数据。

mysql简单入门笔记

mysql简单入门笔记

mysql课堂笔记1、什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?数据库:英文单词DataBase,简称DB。

按照一定格式存储数据的一些文件的组合。

顾名思义:存储数据的仓库,实际上就是一堆文件。

这些文件中存储了具有特定格式的数据。

数据库管理系统:DataBaseManagement,简称DBMS。

数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中的数据进行增删改查。

常见的数据库管理系统:MySQL、Oracle、MS SqlServer、DB2、sybase等....SQL:结构化查询语言程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作。

SQL是一套标准,程序员主要学习的就是SQL语句,这个SQL在mysql中可以使用,同时在Oracle中也可以使用,在DB2中也可以使用。

三者之间的关系?DBMS--执行--> SQL --操作--> DB先安装数据库管理系统MySQL,然后学习SQL语句怎么写,编写SQL语句之后,DBMS对SQL语句进行执行,最终来完成数据库的数据管理。

2、在windows操作系统当中,怎么使用命令来启动和关闭mysql服务呢?语法:net stop服务名称;net start服务名称;3、mysql安装了,服务启动了,怎么使用客户端(DOS或者MySQL 自己的客户端)登录mysql数据库呢?使用bin目录下的mysql.exe命令来连接mysql数据库服务器本地登录(显示编写密码的形式):C:\Users\409>mysql -uroot-ppasswdmysql: [Warning] Using a password on the command line interface can be insecure.Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 12Server version: 8.0.28 MySQL Community Server - GPLCopyright (c) 2000, 2022, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h'for help. Type '\c' to clear the current input statement.mysql>本地登录(隐藏密码的形式):C:\Users\409>mysql -uroot-pEnter password: ******Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 13Server version: 8.0.28 MySQL Community Server - GPLCopyright (c) 2000, 2022, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h'for help. Type '\c' to clear the current input statement.mysql>4、MySQL常用命令1、退出mysql :exit2、查看mysql中有哪些数据库?:show databases;mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || sys |+--------------------+mysql默认自带了4个数据库。

MySQL必知必会笔记

MySQL必知必会笔记

MySQL必知必会笔记(一)基础知识和基本操作第一章了解MySQL数据库保存有组织的数据的容器。

(通常是一个文件或一组文件)人们经常使用数据库这个术语代替他们使用的软件。

这是不正确的,确切的说,数据库软件应称为DBMS(数据库管理系统),数据库是通过DBMS创建和操纵的容器。

漱口可以是保存在硬件设备上的文件,但也可以不是。

你使用DBMS来代替自己访问数据库。

表表是一种结构化的文件可用来存储某种特定的类型的数据。

某种特定类型数据的结构化清单。

模式关于数据库和标的布局及特性的信息列表中的一个字段。

表由列组成。

列中存储着表里某部分的信息。

数据类型所容许的数据的类型。

每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据。

行表中的一个记录主键一列(或一组列),其值能够唯一区分表中的每个行。

虽然不是必须的,但是一般都建立主键。

便于以后的数据管理表中任何列都可以作为主键,只要满足以下条件:1 任意两行都不具有相同的主键值。

2 每个行都必须有一主键值(主键值不允许为NULL)主键的最好习惯:不更新主键列的值不重用主键列的值不在主键列中使用可能会更改的值什么是sqlSql是结构化查询语言的缩写。

Sql是一种专门用类与数据库通信的语言。

第二章 MySQL简介什么是Mysql Mysql是一种DBMS,即它是一种数据库软件。

Mysql版本主要更改4-——InnoDB引擎,增加了事务处理、并、改进全文搜索等支持4.1——对函数库、子查询、集成帮助等的重要增加、5——存储过程、触发器、游标、试图等。

第三章使用mysql连接主机名端口一个合法用户用户口令Mysql -u root -p -h myserver -P 9999选择数据库可使用USE关键字,mysql语言组成部分的一个关键字,绝不要使用关键字命名一个表或列USE dataname;显示数据库列表SHOW DATABASES;一个数据库内的表的列表(USE进入数据库的情况下)SHOW TABLES;SHOW也可以用来显示表列SHOW COLUMNS FROM column;DESCRIBE 是SHOW COLUMNS的一种快捷方式;DESCRIBE cust;其他的SHOW语句SHOW STATUS 显示广泛的服务器状态信息SHOW CREATE DATABASE 显示创建特定数据库的MYSQL语句SHOW CREATE TABLE 显示创建特定表的MYSQL语句SHOW GRANTS 显示授权用户的安全权限SHOW ERRORS 显示服务器的错误信息SHOW WARNINGS 显示服务器的警告信息MySQL必知必会笔记(二)SELECT语句检索排序过滤通配符搜索正则表达式搜索第四章检索数据检索单列SELECT columnOne FROM table;检索多列SELECT columnOne,columnTwo,columnThire FORM table;检索所有列SELECT * FROM products; //一般,除非你确实需要表中的每个列,否则最好不要用*通配符检索不同的行检索出来的数据不重复DISTINCT关键字,顾名思义返回不同的值SELECT DISTINCT columnOne FROM table; //检索出来的columnOne 没有重复值DISTINCT关键字应用于所有列而不仅是前置它的列SELECT DISTINCT vend_id,prod_price......要求vend_id,prod_price这两列都不出现重复的值限制结果条数sql语句后面加入下面sql语句LIMIT 5 显示结果的前5条LIMIT 3,4从行3开始的后4行LIMIT 4 OFFSET 3 从行3开始的后4行第五章排序检索数据子句 Sql语句是由子句构成,有些子句是必须的,有些事可选的。

mysql笔记

mysql笔记

mysql笔记Mysql的第一次回忆Mysql的总的概括可以分为两个部分:三建、四句。

三建指的是:建库、建表格、建约束。

四句指的是:添加、删除、修改、查询。

数据库:存放数据的库,由表、关系、以及操作对象组成,它存放在表中。

实体:行,客观存在,可以被描述的事物。

在java中称为对象。

又称之为记录。

属性:列,事物的特征。

又称之为字段。

数据库服务器:在机器上安装了一个数据库管理程序,一个数据库服务器可以管理多个数据库,一个数据库可以创建多张表。

三建建库:使用关键字create database 库名;建表:使用关键字create table 表名(属性1 类型primary key ;属性2 类型,属性3 类型);在创建表的时候,要注意使用关键字“use 库名”使用指定的数据库。

在创建表时,要根据需要保存的数据创建相应的列,并且根据其类型定义相应的类型。

Mysql中的数据类型:int、char (固定的字符类型)、varchar(可变得字符类型)、boolean 、float(m,d)m代表指定显示的长度,d代表指定的小数位数、text、DateTime、timeStamp时间搓可以自动记录update 、insert的时间。

(时间的规定:从某个时间到现在所经历的毫秒数。

)建约束作用:保障传入数据的数据有效性和准确性。

约束分为:主键约束、外键约束、唯一值约束、非空、检查约束(在mysql中没用)、默认值约束、标识列。

主键约束:在属性后面加上关键字primary key,作用是保证记录的唯一性。

它的值不能重复,也不能为null。

外键约束:在表的外键引用主表的主键。

通过约束后,在进行删除操作时,必须先删子表,再删父表。

在进行更新的时候,必须先更新父表,在更新子表。

不过加入级联删除删除后可以省去删除的麻烦(on delete cascade),加入级联更新后可以省去更新的麻烦(on update cascade)。

MySQL实战45讲(学习笔记)

MySQL实战45讲(学习笔记)

MySQL实战45讲(学习笔记)本系列是学习极客时间林晓斌的《MySQL实战45讲》系列的学习笔记。

原⽂链接:https:///column/intro/13901 基础架构:⼀条SQL查询语句是如何执⾏的?https:///fengfeng2861285642/article/details/85131474https:///u014737928/article/details/85060991https:///u012131610/article/details/9005153502 ⽇志系统:⼀条SQL更新语句是如何执⾏的?https:///fengfeng2861285642/article/details/85712388https:///u014737928/article/details/85062279https:///u012131610/article/details/9005278703 事务隔离:为什么改了还看不见?https:///u014737928/article/details/99731828https:///u012131610/article/details/9016857804 深⼊浅出索引(上)https:///u012131610/article/details/9017404105 深⼊浅出索引(下)https:///u012131610/article/details/9017695306 全局锁和表锁:给表加个字段怎么有这么多阻碍?https:///u012131610/article/details/9019993807 ⾏锁功过:怎么减少⾏锁对性能的影响?https:///u012131610/article/details/9020891308 事务到底是隔离的还是不隔离的?https:///u012131610/article/details/9022900309 普通索引和唯⼀索引,应该怎么选择?https:///u012131610/article/details/9026055810 MySQL为什么有时候会选错索引?https:///u012131610/article/details/9027003111 怎么给字符串字段加索引?https:///u012131610/article/details/9039965212 为什么我的MySQL会“抖”⼀下?https:///u012131610/article/details/9043686713 为什么表数据删掉⼀半,表⽂件⼤⼩不变?https:///u012131610/article/details/9059947714 count(*)这么慢,该怎么办?https:///u012131610/article/details/9063344215 答疑⽂章(⼀):⽇志和索引相关问题https:///u012131610/article/details/9256390816 “order by”是怎么⼯作的?https:///u012131610/article/details/9071048517 如何正确地显⽰随机消息?https:///u012131610/article/details/9074652218 为什么这些SQL语句逻辑相同,性能却差异巨⼤?https:///u012131610/article/details/9103878919 为什么只查⼀⾏的语句,也执⾏这么慢?https:///u012131610/article/details/9141115220 幻读是什么,幻读有什么问题?https:///u012131610/article/details/9148902321 为什么我只改⼀⾏的语句,锁这么多?https:///u012131610/article/details/9178131722 MySQL有哪些“饮鸩⽌渴”提⾼性能的⽅法?https:///u012131610/article/details/9296907423 MySQL是怎么保证数据不丢的?https:///u012131610/article/details/9993657224 MySQL是怎么保证主备⼀致的?https:///u012131610/article/details/10000775225 MySQL是怎么保证⾼可⽤的?https:///u012131610/article/details/10003019226 备库为什么会延迟好⼏个⼩时https:///u012131610/article/details/100090270 27 主库出问题了,从库怎么办?https:///u012131610/article/details/100112609 28 读写分离有哪些坑https:///u012131610/article/details/100112952 29 如何判断⼀个数据库是不是出问题?https:///u012131610/article/details/100113348 30 答疑⽂章(⼆):⽤动态的观点看加锁https:///u012131610/article/details/100129983 31 误删数据后除了跑路,还能怎么办?https:///u012131610/article/details/100130039 32 为什么还有kill不掉的语句?https:///u012131610/article/details/100130460 33 查这么多数据,会不会把数据库内存撑爆?https:///u012131610/article/details/97107364 34 到底可不可以使⽤join?https:///u012131610/article/details/93158401 35 join语句怎么优化https:///u012131610/article/details/97240601 36 为什么临时表可以重名https:///u012131610/article/details/97757120 37 什么时候会使⽤内部临时表https:///u012131610/article/details/97884757 38 都说InnoDB好,那还要不要使⽤Memory引擎https:///u012131610/article/details/98028479 39 ⾃增主键为什么不是连续的?https:///u012131610/article/details/98168871 40 insert语句的锁为什么这么多?https:///u012131610/article/details/98937622 41 怎么最快的复制⼀张表https:///u012131610/article/details/99406030 42 grant之后要跟着flsh privileges吗?https:///u012131610/article/details/99539832 43 要不要使⽤分区表https:///u012131610/article/details/99620613 44 答疑(三)https:///u012131610/article/details/99670766 45 ⾃增id⽤完了怎么办?https:///u012131610/article/details/99714097《MySQL实战45讲》1~15讲https:///zxcc1314/article/details/84842650《MySQL实战45讲》16~30讲https:///zxcc1314/article/details/85216128《MySQL实战45讲》31~45讲https:///zxcc1314/article/details/88087028。

MySQL自学笔记

MySQL自学笔记

MySQL自学笔记1. 字符串mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello'; +-------+---------+-----------+--------+--------+| hello | "hello" | ""hello"" | hel'lo | 'hello |+-------+---------+-----------+--------+--------+mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello"; +-------+---------+-----------+--------+--------+| hello | 'hello' | ''hello'' | hel"lo | "hello |+-------+---------+-----------+--------+--------+2. 数据库、表、索引、列和别名如果标识符是一个受限掉的词或包含特殊的字符,当使用它时,必须以一个` (backtick) 来引用它。

mysql> SELECT * FROM `select` WHERE `select`.id > 100;句法意味着表在当前数据库中。

MySQL实战45讲学习笔记:第一讲

MySQL实战45讲学习笔记:第一讲

MySQL实战45讲学习笔记:第⼀讲⼀、MySQL逻架构图⼆、连接器⼯作原理刨析1、连接器⼯作原理图2、原理图说明1、连接命令mysql -h$ip -P$port -u$user -p2、查询链接状态3、长连接端连接1、什么是长链接?数据库⾥⾯,长连接是连接成功后,如果客户端持续有请求,则⼀直使⽤同⼀个链接。

2、什么是短连接?短连接则是指每次执⾏完很少的⼏次查询就断开连接,下次查询重新建⽴⼀个3、尽量使⽤长链接建⽴连接的过程通常是⽐较复杂的,所以我建议你在使⽤中尽量减少建⽴的动作,也就是使⽤长连接三、使⽤长链接困惑及解决⽅案1、为什么MySQL占⽤内存涨得特别快但是全部是⽤长连接后,你可能会发现,有些时候MySQL占⽤内存涨得特别快,这是因为MySQL在执⾏过程中临时使⽤的内存管理在连接对象⾥⾯的,这些资源会在连接断开的时候才释放,所以如果长链接积累下来,可能导致内存占⽤⼤,被系统强⾏杀掉,从现象看就是MySQL异常重启了2、如何解决MySQL占⽤内存涨得特别快1、定期断开长链接,使⽤⼀段时间,或者程序⾥⾯判断执⾏过⼀个占⽤内存的⼤查询后,断开连接,之后要查询再连接2、如果你⽤的是MySQL5.7或更新版本,可以在每次执⾏⼀个⽐较⼤的操作后,通过执⾏mysql_reset_connection来重新初始化连接资源,这个过程不需要重连或重新做权限验证,但是会将连接回复到刚刚创建完时的状态四、查询缓存1、⼯作流程刨析图解1. MySQL拿到⼀个查询请求后,会先到查询缓存看看,之前是不是执⾏过这条语句,如果有,就直接返回给客户端2. 如果语句不在查询缓存中,就会继续后⾯的执⾏阶段。

3. 执⾏完成后,执⾏结果会被存⼊查询缓存中,4. 如果查询命中缓存MySQL不需要执⾏后⾯的复杂操作,就可以直接返回结果,这个效率会很⾼2、为什么⼤多数情况下⽐建议使⽤查询缓存?1、查询缓存的失效⾮常频繁,只要有⼀个表更新,这个表上所有的查询缓存都被清空2、对于更新压⼒⼤的数据库来说,查询缓存的命中率会⾮常低,3、除⾮你的业务就是有⼀张静态表,很长时间才会更新⼀次(⽐如⼀个系统配置表)1、默认语句不实⽤查询缓存MySQL提供的按需使⽤的⽅式query_cache_type 设置成 DEMAND2、确定需要查询缓存的语句mysql> select SQL_CACHE * from T where ID=10;MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了。

mysql基础笔记”

mysql基础笔记”

mysql基础笔记”MySQL是一种开源的关系型数据库管理系统,被广泛应用于Web 应用程序的数据存储和管理。

下面是关于MySQL基础的一些笔记:1. 数据库,MySQL是基于数据库的,数据库是一个用于存储和管理数据的容器。

可以创建多个数据库,每个数据库可以包含多个表。

2. 表,表是数据库中的一个组成部分,用于存储数据。

表由行和列组成,每一列代表一个数据字段,每一行代表一条记录。

3. 字段,字段是表中的列,用于存储特定类型的数据。

每个字段都有一个数据类型,如整数、字符串、日期等。

4. 主键,主键是表中的一列或一组列,用于唯一标识表中的每一行。

主键的值不能重复,且不能为空。

5. 外键,外键是表中的一列,用于建立表与表之间的关系。

外键与其他表中的主键相关联,用于确保数据的完整性和一致性。

6. 查询,查询是从数据库中检索数据的操作。

可以使用SQL语句来编写查询,SQL是结构化查询语言。

7. 插入,插入是向表中添加新记录的操作。

可以使用INSERT语句来插入数据。

8. 更新,更新是修改表中现有记录的操作。

可以使用UPDATE语句来更新数据。

9. 删除,删除是从表中删除记录的操作。

可以使用DELETE语句来删除数据。

10. 索引,索引是对表中的一列或多列进行排序的结构,用于加快数据的检索速度。

可以根据索引进行快速的查询操作。

11. 视图,视图是基于一个或多个表的查询结果,可以像表一样使用。

视图可以简化复杂的查询操作,提供更方便的数据访问方式。

12. 事务,事务是一组数据库操作的集合,要么全部执行成功,要么全部回滚。

事务可以确保数据的一致性和完整性。

13. 存储过程,存储过程是一组预编译的SQL语句,可以在数据库中进行复杂的操作。

存储过程可以提高数据库的性能和安全性。

14. 触发器,触发器是与表相关联的特殊类型的存储过程,可以在插入、更新或删除数据时自动执行。

以上是关于MySQL基础的一些笔记,希望对你有所帮助。

《快速念咒: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数据库基础笔记

mysql数据库基础笔记

mysql数据库基础笔记MySQL是一款开源免费的关系型数据库管理系统,被广泛应用于各种应用程序中。

对于初学者来说,掌握MySQL数据库的基础知识是非常重要的。

在本文中,将向读者们介绍MySQL数据库的基础知识,包括如何安装、创建数据库和表、插入数据以及查询数据等。

第一步:安装MySQL数据库。

首先,我们需要下载MySQL的安装包并进行安装。

在安装过程中,需要设置root用户的密码,同时也可以选择安装路径和配置选项。

安装完成后,我们就可以开始使用MySQL 数据库了。

第二步:创建数据库。

在MySQL中,我们可以通过SQL命令来创建数据库。

例如,我们可以使用以下的命令创建一个名为“testdb”的数据库:CREATE DATABASE testdb;第三步:创建表。

在数据库中,我们需要创建表来存储数据。

我们可以使用以下的命令创建一个名为“users”的表:CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), age INT);上述命令创建了一个包含三个字段(id、name、age)的数据表,其中id是自增字段,作为主键。

第四步:插入数据。

接下来,我们需要向表中插入数据。

我们可以使用以下的命令插入一条数据:INSERT INTO users (name, age) VALUES ('John Smith', 30);这个命令将“John Smith”和“30”分别插入到“name”和“age”字段中。

第五步:查询数据。

最后,我们可以使用SELECT命令来查询表中的数据。

例如,我们可以使用以下的命令来查询users表中的所有数据:SELECT * FROM users;这个命令将返回users表中的所有数据。

除了上述基础操作外,MySQL还有许多高级功能,例如数据关联、表连接以及事务控制等。

不过,在掌握MySQL基础知识的基础上,我们才能更好地应用这些高级功能。

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参数是可选参数,是否在语句中出现不会影响语句的执⾏。

最全mysql笔记整理

最全mysql笔记整理

最全mysql笔记整理mysql笔记整理作者:python技术⼈博客:Windows服务-- 启动MySQLnet start mysql-- 创建Windows服务sc create mysql binPath= mysqld_bin_path(注意:等号与值之间有空格)连接与断开服务器mysql -h 地址 -P 端⼝ -u ⽤户名 -p 密码show processlist -- 显⽰哪些线程正在运⾏show variables -- 显⽰系统变量信息数据库操作-- 查看当前数据库select database();-- 显⽰当前时间、⽤户名、数据库版本select now(), user(), version();-- 创建库create database[ if not exists] 数据库名数据库选项数据库选项:character set charset_namecollate collation_name-- 查看已有库show databases[ like pattern ]-- 查看当前库信息show create database 数据库名-- 修改库的选项信息alter database 库名选项信息-- 删除库drop database[ if exists] 数据库名同时删除该数据库相关的⽬录及其⽬录内容表的操作-- 创建表create [temporary] table[ if not exists] [库名.]表名 ( 表的结构定义 )[ 表选项]每个字段必须有数据类型最后⼀个字段后不能有逗号temporary 临时表,会话结束时表⾃动消失对于字段的定义:字段名数据类型 [not null | null] [default default_value] [auto_increment] [unique [key] | [primary] key] [comment string ]-- 表选项-- 字符集charset = charset_name如果表没有设定,则使⽤数据库字符集-- 存储引擎engine = engine_name表在管理数据时采⽤的不同的数据结构,结构不同会导致处理⽅式、提供的特性操作等不同常见的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive不同的引擎在保存表的结构和数据时采⽤不同的⽅式MyISAM表⽂件含义:.frm表定义,.MYD表数据,.MYI表索引InnoDB表⽂件含义:.frm表定义,表空间数据和⽇志⽂件show engines -- 显⽰存储引擎的状态信息show engine 引擎名 {logs|status} -- 显⽰存储引擎的⽇志或状态信息-- ⾃增起始数auto_increment = ⾏数-- 数据⽂件⽬录data directory = ⽬录-- 索引⽂件⽬录index directory = ⽬录-- 表注释comment = string-- 分区选项PARTITION BY ... (详细见⼿册)-- 查看所有表show tables[ like pattern ]show tables from 表名-- 查看表机构show create table 表名(信息更详细)desc 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE PATTERN ]show table status [from db_name] [like pattern ]-- 修改表-- 修改表本⾝的选项alter table 表名表的选项eg: alter table 表名 engine=MYISAM;-- 对表进⾏重命名rename table 原表名 to 新表名rename table 原表名 to 库名.表名(可将表移动到另⼀个数据库)-- rename可以交换两个表名-- 修改表的字段机构(13.1.2. ALTER TABLE语法)alter table 表名操作名-- 操作名add[ column] 字段定义 -- 增加字段after 字段名 -- 表⽰增加在该字段名后⾯first -- 表⽰增加在第⼀个add primary key(字段名) -- 创建主键add unique [索引名] (字段名)-- 创建唯⼀索引add index [索引名] (字段名) -- 创建普通索引drop [ column] 字段名 -- 删除字段modify[ column] 字段名字段属性 -- ⽀持对字段属性进⾏修改,不能修改字段名(所有原有属性也需写上)change[ columns] 原字段名新字段名字段属性 -- ⽀持对字段名修改drop primary key -- 删除主键(删除主键前需删除其AUTO_INCREMENT属性)drop index 索引名 -- 删除索引drop foreign key 外键 -- 删除外键-- 删除表drop table[ if exists] 表名 ...-- 清空表数据truncate [table] 表名-- 复制表结构-- 复制表结构和数据create table 表名 [as] select * from 要复制的表名-- 检查表是否有错误check table tbl_name [, tbl_name] ... [option] ...-- 优化表optimize [local | no_write_to_binlog] table tbl_name [, tbl_name] ...-- 修复表repair [local | no_write_to_binlog] table tbl_name [, tbl_name] ... [quick] [extended] [user_frm]-- 分析表analyze [local | no_write_to_binlog] table tbl_name [, tbl_name] ...数据操作-- 增insert [into] 表名 [(字段列表)] values (值列表)[, (值列表), ...]-- 如果要插⼊的值列表包含所有字段并且顺序⼀致,则可以省略字段列表。

MySQL学习笔记

MySQL学习笔记

MySQL学习文档________________________________________ Table of Contets1. MySQL数据库的数据1.1. 数据值类型(data type)1.1.1. 数值1.1.2. 字符串1.1.3. 日期和时间1.2. 列类型(column type)1.2.1. 数值类的数据列类型1.2.2. 字符串类数据列类型1.2.3. 日期,时间型数据列类型1.3. 唯一编号1.4. 字符集支持1.4.1. MySQL4.1以前版本1.4.2. MySQL4.1以后版本1.4.3. 各级字符集的查询方法1.4.4. Unicode支持1.5. 如何选择数据列类型?1.6. 表达式操作符1.7. 类型转换2. 查询优化2.1. 索引2.2. 查询优化程序2.3. 数据列类型与查询效率2.4. 有效地加载数据2.5. 调度和锁定2.6. 服务器优化2.7. 硬件优化3. 数据库管理3.1. 数据目录3.2. MySQL数据表在系统中表现形式3.3. 数据表最大尺寸限制3.4. 状态文件和日志文件3.5. 调整MySQL数据目录位置4. MySQL数据库日常管理4.1. 数据库安全管理4.2. 服务器的启动和关闭4.3. 连接故障恢复4.4. MySQL用户帐号管理4.5. 日志文件管理4.5.1. 日志失效处理4.6. MySQL服务器的一些优化配置4.7. 优化服务器4.8. 运行多个MySQL服务器4.9. MySQL服务器镜像配置5. 数据库安全5.1. 保护MySQL安装程序文件5.2. 权限表5.3. 建立加密连接6. 数据库的备份、维护和修复6.1. 检查/修复数据表6.2. 备份数据库6.3. 使用备份恢复数据7. MySQL程序介绍8. MySQL How-To8.1. 连接数据库服务器8.2. 更新用户密码8.3. MySQL读取配置文件的顺序8.4. 重设置MySQL管理员密码的方法8.5. NULL值8.6. 使用SQL变量8.7. 改变默认提示符8.8. 非优化的全数据表DELETE操作8.9. MySQL事务处理示例List of Tables1.1. 转义序列1.2. 数值类数据列类型1.3. 字符串类数据列类型1.4. 日期,时间类型列1.5. 算术操作符1.6. 逻辑操作符1.7. 位操作符1.8. 比较操作符1.9. 操作符优先级(由高至低排列)3.1. 状态文件和日志文件3.2. MySQL数据目录及目录中文件位置的调整方法4.1. 访问权限表4.2. 权限作用范围(由ON子句设置)4.3. 日志启动选项4.4. BDB和InnoDB数据表日志选项Chapter 1. MySQL数据库的数据Table of Contents1.1. 数据值类型(data type)1.1.1. 数值1.1.2. 字符串1.1.3. 日期和时间1.2. 列类型(column type)1.2.1. 数值类的数据列类型1.2.2. 字符串类数据列类型1.2.3. 日期,时间型数据列类型1.3. 唯一编号1.4. 字符集支持1.4.1. MySQL4.1以前版本1.4.2. MySQL4.1以后版本1.4.3. 各级字符集的查询方法1.4.4. Unicode支持1.5. 如何选择数据列类型?1.6. 表达式操作符1.7. 类型转换MySQL数据库是由数据组成的,为了能方便管理和使用这些数据,我们把这些数据进行分类,形成各种数据类型,有数据值的类型,有表中数据列的类型,有数据表的类型。

mysql基础完整笔记

mysql基础完整笔记

MySQL是一个流行的关系型数据库管理系统。

以下是一个MySQL基础知识的完整笔记:安装与配置在不同的操作系统上安装MySQL。

配置MySQL服务器的端口、用户权限、日志文件等。

基本命令SHOW DATABASES;:显示所有数据库。

USE [database_name];:选择一个数据库。

SHOW TABLES;:显示当前数据库中的所有表。

数据类型数值类型:INT, FLOAT, DECIMAL, BIGINT 等。

日期和时间类型:DATE, TIME, DATETIME, TIMESTAMP 等。

字符串类型:CHAR, VARCHAR, TEXT, TINYTEXT 等。

创建表定义表结构,例如CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(255), email VARCHAR(255))。

使用AUTO_INCREMENT 自动生成主键。

插入数据使用INSERT INTO [table_name] (column1, column2, ...) VALUES (value1, value2, ...); 插入数据。

查询数据基本查询:SELECT * FROM [table_name];。

条件查询:SELECT * FROM [table_name] WHERE [condition];。

排序查询:SELECT * FROM [table_name] ORDER BY [column] [ASC|DESC];。

聚合函数:COUNT(), SUM(), AVG(), MAX(), MIN() 等。

更新数据使用UPDATE [table_name] SET column1 = value1, column2 = value2, ... WHERE [condition]; 更新数据。

删除数据使用DELETE FROM [table_name] WHERE [condition]; 删除数据。

Mysql_自学笔记

Mysql_自学笔记

Mysql 自学笔记前言综述:磁盘搜索。

需要花时刻从磁盘上找到一个数据,用在现代磁盘的平均时刻通常小于10ms,因此理论上咱们能够每秒大约搜索1000次。

那个时刻在新磁盘上提高不大而且很难为一个表进行优化。

优化它的方式是将数据散布在多个磁盘上。

磁盘读/写。

当磁盘放入正确位置后,咱们需要从中读取数据。

关于现代的磁盘,一个磁盘至少传输10-20Mb/s的吞吐。

这比搜索要容易优化,因为你能从多个磁盘并行地读。

CPU周期。

咱们将数据读入内存后,需要对它进行处置以取得咱们需要的结果。

表相关于内存较小是最多见的限制因素。

可是关于小表,速度通常不成问题。

·内存带宽。

当CPU需要的数据超出CPU缓存时,主缓存带宽就成为内存的一个瓶颈。

这在大多数系统正是一个不常见的瓶颈可是你应该明白它。

一. MySQL设计局限与折衷1. 若是向列内插入不适合的或超出范围的值,MySQL将该列设定为“最好的可能的值”,而不是报告错误。

关于数字值,为0、可能的最小值或最大值。

关于字符串,为空字符串或列内能够保留的字符串。

请注意当运行在严格模式或TRADITIONAL SQL模式时该行为不适用。

固然这仅仅是在严格的模式下,包括TRADITIONAL SQL 模式,必需为not null 指定默许值。

二。

可移植性若是你利用某个数据库特定的功能(例如MySQL专用的REPLACE语句),应该为SQL 效劳器编码一个方式以实现一样的功能。

尽管慢些,但确许诺其它效劳器执行一样的任务。

用MySQL,能够利用/*! */语法把MySQL特定的关键词加到查询中。

在/**/中的代码将被其它大多数SQL效劳器视为注释(并被忽略)。

三。

优化SELECT 查询1.阻碍所有语句的一个因素是:你的许可设置得越复杂,所需要的开销越多。

执行GRANT语句时利用简单的许可,当客户执行语句时,能够使MySQL降低许可检查开销。

例如,若是未授予任何表级或列级权限,效劳器不需要检查tables_priv和columns_priv表的内容。

mysql数据库基础知识笔记

mysql数据库基础知识笔记

MySQL是一种关系型数据库管理系统,它使用结构化查询语言(SQL)来进行数据管理和查询。

以下是MySQL数据库的基础知识笔记:
数据库:一组相关数据的集合。

表:存储在数据库中的数据组织形式。

列:表中的一个字段,定义了该列所存储的数据类型。

行:表中的一条记录,由多个列组成。

主键:唯一标识表中每一行的特定列。

外键:一个表中的列,与另一个表中的主键建立连接关系,用于保证数据完整性和减少数据冗余。

索引:为了提高查询效率而创建的数据结构,可以根据索引快速搜索和查找数据。

关系型数据库:以表格形式存储数据,通过关联不同表之间的主键和外键来建立关系。

非关系型数据库:将数据以文档、键值对或图形等方式存储,适用于分布式、非结构化数据场景。

SQL语句:用于对MySQL数据库进行查询、插入、更新和删除操作的编程语言,包括SELECT、INSERT、UPDATE、DELETE等命令。

MySQL数据库零基础入门笔记

MySQL数据库零基础入门笔记

Mysql数据库的安装和基本配置
默认的mysql不是最新的5.1.61,如果要用最新版的就要去官网下载了rpm安装。

quit退出。

因为MySQL是一个网络服务,他是一个支持网络的数据服务并不是单机的。

一般mysql 服务都是独立的,mysql默认使用TCP协议,默认端口是3306
所以说我们可以通过远程连接到主机3306端口,连接到mysql服务。

第一节Mysql数据库的基本操作
Mysql约定俗成使用大写,但是用小写没关系,不敏感的。

百分之90以上SQL语句结尾要加”;”分号。

不加就会以为sql语句没有结束。

语句较长的话可以分几行来写。

只要你不加分号结尾就行了。

Mysql中没有重新命名数据库名称的命令。

网上说可以使用rename命令,那绝对不可能的。

第三节课Mysql数据库基础-Sql语言基础1
第四节课Mysql用户管理基础
第五节课Mysql权限管理基础
尽量不给咬root设置任何远程都可以连接,网上攻击非常多,万一被黑了就麻烦了。

第六节课Mysql简单备份
第七节课Mysql数据库数据编码
数据库在保存不同数据的时候,使用不同的编码可以使用最优的编码方式。

而已节省空间。

如果数据库里面有数据的时候,修改数据库编码,这时候可能数据会出现问题,所以尽量不要在有数据的时候修改编码。

.。

mysql数据库管理系统笔记

mysql数据库管理系统笔记

mysql数据库管理系统笔记MySQL数据库管理系统是一种流行的关系型数据库管理系统,广泛应用于各种应用程序和网站。

下面是一些关于MySQL的笔记:1. 安装和配置:MySQL可以通过不同的方式进行安装,包括二进制包、源代码和包管理器。

安装完成后,需要配置MySQL服务器,包括设置用户和权限、配置网络连接等。

2. 数据库和表:MySQL数据库由多个表组成,每个表包含一系列的行和列。

使用`CREATE DATABASE`和`CREATE TABLE`语句可以创建数据库和表。

3. 数据类型:MySQL支持多种数据类型,包括整数、浮点数、字符串、日期和时间等。

不同的数据类型适用于不同的数据存储需求。

4. 查询语言:MySQL使用结构化查询语言(SQL)进行数据操作和管理。

使用SELECT语句可以从表中检索数据,使用INSERT、UPDATE和DELETE语句可以插入、更新和删除数据。

5. 索引:索引用于加快查询速度,通过索引可以快速定位到表中的数据。

MySQL支持多种索引类型,包括B-tree索引、哈希索引等。

6. 视图:视图是一个虚拟表,它是基于SQL查询的结果集。

通过视图可以简化复杂的查询操作,同时提供数据安全性。

7. 存储过程和函数:存储过程是一组为了完成特定功能的SQL语句集合。

函数类似于存储过程,但函数可以返回值。

8. 触发器:触发器是与表相关联的特殊类型的存储过程,它会在指定事件(如INSERT、UPDATE或DELETE)发生时自动执行。

9. 事务处理:事务是一系列的操作,这些操作要么全部成功执行,要么全部失败回滚。

MySQL支持事务处理,确保数据的完整性和一致性。

10. 安全性和权限:MySQL提供了用户管理和权限控制机制,可以设置不同用户对数据库的访问权限。

通过设置用户名、密码和权限,可以控制用户对数据库的访问和操作。

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

创建student表CREATE TABLE student (sNo int(11) NOT NULL DEFAULT '0',sName varchar(10) DEFAULT NULL,sSex enum('m','f') DEFAULT 'm',sAge tinyint(4) DEFAULT '18',sClass varchar(10) DEFAULT NULL,PRIMARY KEY (sNo),KEY index_name (sName)) ENGINE=InnoDB DEFAULT CHARSET=utf8;创建course表CREATE TABLE course(cNo tinyint(4) NOT NULL,cName varchar(20) NOT NULL,cCredit tinyint(4) NOT NULL,PRIMARY KEY ( cNo)) ENGINE=InnoDB DEFAULT CHARSET=utf8;创建score表create table score(sNo int not null,cNo tinyint not null,score tinyint,primary key(sNo,cNo),constraint foreign key(sNo) references student(sNo),constraint foreign key(cNo) references course(cNo))engine=innoDB default charset=utf8;insert into coursevalues(1,"计算机操作系统",3),(2,"计算机基础教程",2),(3,"计算机导论",4),(4,"C++ Primer",4),(5,"MySQL入门与精通",5); mysql的SQL语句:创建表:create table student(id int not null primary key,name char(10) not null,sex char(2) not null);修改表结构:增加,删除,修改字段alter table studentdrop sex,add birthday date,alter name set default ‘zhangsan’;//设置默认值修改字段为非空alter table student modify sSex char(2) not null;修改字段的名称:alter table studentchange name name2 varchar(10);修改字段的顺序中的位置首先,先删除此字段,然后再增加此字段,并标示位置alter table studentdrop name2;alter talbe studentadd name varchar(10) after id; 或者add name varchar(10) second;修改表名:alter table student rename student2;显示表的字段状态:show columns from student;显示数据库中表的信息:show table status;修改表的存储引擎类型:alter table student engine=myisam;增加主键:alter table student add primary key(id);删除主键:alter table student drop primary key;加索引:alter table talbename add index 索引名(字段1,字段2,。

);删除某个索引:alter table tablename drop index 索引名;修改为自增:alter table student modify id int auto_increment;修改字段的类型:alter table student modify id int;修改性别的类型alter table student modify sSex enum('m','f') default 'm' ;插入数据:insert into student(id,name,sex)values(1,”zhangsan”,’1’),(2,”lisi”,’2’),(3,”xiaocao”,’2’);数据的修改操作:首先,单表的UPDATE语句:UPDATE [LOW_PRIORITY] [IGNORE] tbl_nameSET col_name1=expr1 [, col_name2=expr2 ...][WHERE where_definition][ORDER BY ...][LIMIT row_count]修改表(/数据库)的字符集:(此方法能修改表的所有字段的字符集)alter table studentconvert to character set utf8;或者修改表(/数据库)的默认字符集(此方法只能修改默认字符集,某个字段的字符集可能不会改变)alter table studentdefault character set=utf8;解决中文乱码问题:把字符集改为utf8例外一种方法:修改默认文件的配置/etc/f[mysqld]添加:character-set-server=utf8[client]default-character-set=utf8[mysql]default-character-set=utf8第五章创建高性能的索引索引(在MySQL中也叫“键(key)”)是存储引擎用于快速找到记录的一种数据结构。

索引对于良好的性能非常关键。

尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。

在数据量较小负载较低时,不恰当的索引对性能的影响可能不明显,但当数据量主键增大时,性能则会急剧下降。

索引可以包含一个或多个列的值。

如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列。

5.1.1索引的类型在MySQL中,索引是在存储引擎层而不是在服务器层实现的,所以,并没有统一的索引标准:不同的存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引。

一、B-Tree索引所用B-Tree数据结构来存储数据。

大多数MySQL存储引擎都支持这种索引。

实际上,很多存储引擎使用的是B+Tree,即每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历。

InnoDB的索引则使用的是B+Tree这种数据结构。

请具体查看B+Tree的数据结构:非叶子节点不存储数据,只存储指向下一层节点的指针,只有叶子节点才存储被索引的数据,且叶子节点有一个指针指向下一个相邻叶子节点。

B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表(磁盘中)扫描来获取需要的数据,取而代之的是从索引(在内存)中搜索。

索引对多个值进行排序的顺序的依据是create table语句中定义索引列的顺序。

B-Tree索引适合用于全键值、键值范围或键前缀查找。

全值匹配全值匹配指的是和索引中的所有列进行匹配。

匹配最左前缀在where条件中只匹配索引列的第一列,或前几列。

匹配列前缀可以只匹配某一列的值得开头部分。

例如where name=”J%”。

匹配范围值可以匹配某一列设定一个范围,前提是,在索引中匹配范围列的前面的列,必须是具体的值,否则不能利用索引。

精确匹配某一列并范围匹配另外一列例如,索引中的第一列是某个确定的值,且第二列是一个范围匹配。

只访问索引的查询只访问索引的查询,即查询只需要访问索引,而无需访问数据行。

这就是所谓的覆盖索引。

B-Tree索引的限制:1.如果不是按照索引的最左列开始查找,则无法使用索引。

2.不能跳过索引中的列。

否则,也不能使用索引。

3.如果查询中有某个范围查询,则其右边所有列都无法使用索引优化查询。

二、哈希索引哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。

对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。

哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。

如果多个列的哈希值相同,索引会以链表的方式存放多个记录指针到同一个哈希条目中。

在Mysql中,只有Memory存储引擎显示支持哈希索引。

这也是Memory引擎表的默认索引类型,Memory引擎同时也支持B-Tree索引。

例外,Memory引擎是支持非唯一哈希索引的。

由于哈希索引只存储哈希值和对应的数据行指针,所以索引的结构十分紧凑,这也让哈希索引查找的速度非常快。

然后,哈希索引也有它的限制:1.哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。

2.哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序。

3.哈希索引不支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值得。

例如,在数据列(A,B)上建立哈希索引,如果查询只有数据列A,则无法使用该索引。

4.哈希索引只支持等值比较查询,包括=,IN(),<=>。

也不支持任何范围查询。

例如where price>100。

5.访问哈希索引的数据非常快,除非有很多哈希冲突。

当出现哈希索引冲突的时候,存储引擎必须遍历链表中所有的行指针,逐行进行比较,直到找到所有符合条件的行。

6.如果哈希冲突很多的话,一些索引维护操作的代价也会很高。

自适应哈希索引(adaptive hash index)InnoDB会监控对表上各索引页的查询。

如果发现默写索引值被使用得非常频繁时,它会在内存中基于B-Tree索引之上再创建一个哈希索引。

则建立哈希索引会带来性能的提升。

不需要对整张表都构建哈希索引,所以构建速度会特别快。

InnoDB会自动根据访问的频率和模式自动地为某些热点建立哈希索引。

这是一个完全自动地,内部的行为,用户无法控制或者配置,不过如果有必要,完全可以关闭该功能。

默认是开启的。

5.2索引的优点1.索引大大减少了服务器需要扫描的数据量。

2.索引可以帮助服务器避免排序和临时表。

3.索引可以将随机I/O变为顺序I/O。

三星系统(three-star system)索引将相关的记录放到一起则获得一星;如果索引中的数据顺序和查找中的排列顺序一致则获得二星;如果索引中的列包含了查询中需要的全部列则获得三星。

相关文档
最新文档