精华内容
下载资源
问答
  • python模块以及导入出现ImportError: No module named 'xxx'问题
    2020-11-23 15:29:49

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包。只要模

    块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用

    如果你要使用的模块(py文件)和当前模块在同一目录,只要import相应的文件名就好,比

    如在a.py中使用b.py:

    import b

    但是如果要import一个不同目录的文件(例如b.py)该怎么做呢?

    首先需要使用sys.path.append方法将b.py所在目录加入到搜素目录中。然后进行import即

    可,例如

    import sys

    sys.path.append('c:\xxxx\b.py') # 这个例子针对 windows 用户来说的

    大多数情况,上面的代码工作的很好。但是如果你没有发现上面代码有什么问题的话,可要

    注意了,上面的代码有时会找不到模块或者包(ImportError: No module named

    xxxxxx),这是因为:

    sys模块是使用c语言编写的,因此字符串支持 '\n', '\r', '\t'等来表示特殊字符。所以

    上面代码最好写成:

    sys.path.append('c:\\xxx\\b.py')

    或者sys.path.append('c:/xxxx/b.py')

    这样可以避免因为错误的组成转义字符,而造成无效的搜索目录(sys.path)设置。

    sys.path是python的搜索模块的路径集,是一个list

    可以在python 环境下使用sys.path.append(path)添加相关的路径,但在退出python环境后

    自己添加的路径就会自动消失了!

    3、搜索路径和路径搜索

    模块的导入需要叫做“路径搜索”的过程。

    搜索路径:查找一组目录

    路径搜索:查找某个文件的操作

    ImportError: No module named myModule

    这种错误就是说:模块不在搜索路径里,从而导致路径搜索失败!

    导入模块时,不带模块的后缀名,比如.py

    Python搜索模块的路径:

    1)、程序的主目录

    2)、PTYHONPATH目录(如果已经进行了设置)

    3)、标准连接库目录(一般在/usr/local/lib/python2.X/)

    4)、任何的.pth文件的内容(如果存在的话).新功能,允许用户把有效果的目录添加到模块搜索路径中去

    .pth后缀的文本文件中一行一行的地列出目录。

    这四个组建组合起来就变成了sys.path了,

    >>> import sys

    >>> sys.path

    导入时,Python会自动由左到右搜索这个列表中每个目录。

    关于 python ImportError: No module named 'xxx'的问题?

    解决方法如下:

    1. 使用PYTHONPATH环境变量,在这个环境变量中输入相关的路径,不同的路径之间用逗号

    (英文的!)分开,如果PYTHONPATH 变量还不存在,可以创建它!

    这里的路径会自动加入到sys.path中,永久存在于sys.path中而且可以在不同的python版本

    中共享,应该是一样较为方便的方法。

    C:\Users\Administrator\Desktop\test\module1.py:

    def func1():

    print("func1")

    将C:\Users\Administrator\Desktop\test添加到PYTHONPATH即可直接import module1,然后

    调用:module1.func1()即可。

    2. 将自己做的py文件放到 site_packages 目录下

    3. 使用pth文件,在 site-packages 文件中创建 .pth文件,将模块的路径写进去,一行一

    个路径,以下是一个示例,pth文件也可以使用注释:

    # .pth file for the my project(这行是注释),命名为xxx.pth文件

    C:\Users\Administrator\Desktop\test

    这个不失为一个好的方法,但存在管理上的问题,而且不能在不同的python版本中共享。

    4. 在调用文件中添加sys.path.append("模块文件目录");

    5. 直接把模块文件拷贝到$python_dir/Lib目录下。

    通过以上5个方法就可以直接使用import module_name了。

    python模块以及导入出现ImportError: No module named ‘xxx‘问题

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用如果你要使 ...

    命令行执行python模块时提示ImportError: No module named xxx

    在pycharm中运行python文件没有问题,切换到cmd中是提示:ImportError: No module named xxx 原因: pycharm在运行时会把当前工程的所有文件夹路径都作为 ...

    python导入模块报错:ImportError: No module named mysql.connector(安装 mysql)

    python的版本是 $ python --version Python 2.7.12 报错代码如下 import mysql.connector 报错信息是 ImportError: No modu ...

    解决:python命令行运行出错 ImportError: No module named ...

    一. 发现问题 今天在cmd命令行运行一个py文件,本来在pycharm中运行好好的文件,在命令行却报错了,直接提示我:ImportError: No module named 'homeworks' ...

    python pip 不能用报错: ImportError: No module named _internal

    使用python pip安装包的时候报错: Traceback (most recent call last): File "/usr/local/bin/pip", line 7 ...

    crontab中运行python程序出错,提示ImportError: No module named解决全过程

    将一个python脚本放入crontab执行时,提示如下错:ImportError: No module named hashlib但是在shell中直接执行时没有任何问题,google之后,得到线索 ...

    使用python(command line)出现的ImportError: No module named 'xxx'问题

    当你在python.exe直接输入 import test 时报出importerror: no module named 'test' ,这个错误时由于路径问题,sys并没有找到你输入的这个文件 解 ...

    命令行执行python文件时提示ImportError: No module named 'xxx'

    背景: 最近在写接口自动化测试框架的时候发现,框架使用pycharm ide的时候可以正常跑测试用例,但是在dos窗口输入命令执行测试的时候,import项目内部的包时报错“ModuleNotFoun ...

    Linux 更新python至2.7后ImportError: No module named _ssl

    原文:http://blog.51cto.com/hunt1574/1630961 编译安装python 2.7后无法导入ssl包 解决办法: 1 下载地址:http://www.openssl.or ...

    随机推荐

    wamp下Apache配置vhost

    1.由于后面虚拟机中需要用到Rewrite所以先编辑Apache的conf目录下的httpd.conf文件.(我的文件位置是:D:\Program Files\wamp\bin\apache\apac ...

    Occlusion Culling

    遮挡剔除 http://www.bjbkws.com/online/1092/ unity遮挡剔除(应用) http://www.unitymanual.com/thread-37302-1-1.ht ...

    Win10 for Phone 裁剪保存

    //StorageFolder savedPics = ApplicationData.Current.LocalFolder; //BitmapImage bi = new BitmapImage( ...

    hdu 1213

    简单并查集 #include #include #define maxn 30005 int fa[maxn],ans[maxn],n,m ...

    C语言的引用计数与对象树

    引用计数与对象树 cheungmine 2013-12-28 0 引言 我们经常在C语言中,用指针指向一个对象(Object)的结构,也称为句柄(Handle),利用不透明指针的技术把结构数据封装成对 ...

    安装windows 10到固态硬盘实践记录

    1.前提 由于之前一直用的机械硬盘,电脑用了几年是越来越慢,所以打算买个SSD,装个新系统,其他的机械硬盘都当从盘用 2.准备工作 SSD :256G 3星的 WIN10正版光盘一张 外置光驱一个 3 ...

    JQuery监听页面滚动总结

    1.当前滚动的地方的窗口顶端到整个页面顶端的距离: var winPos = $(window).scrollTop(); 2.获取指定元素的页面位置: $(val).offset().top; 3. ...

    梯度下降算法(Gradient Descent)

    近期在搞论文,须要用梯度下降算法求解,所以又一次整理分享在这里. 主要包含梯度介绍.公式求导.学习速率选择.代码实现. 梯度下降的性质: 1.求得的解和选取的初始点有关 2.能够保证找到局部最优解,由 ...

    (原)未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值与DATEADD

    SQLServer2014,查询分析器中 这样的脚本是没有问题的:AND TPO.CREATEON <= DATEADD(DAY, 1, '2017/3/3 0:00:00') 但.NET  D ...

    django 表单系统 之 forms&period;Form

    继承forms.Form实现django表单系统 参考: https://www.cnblogs.com/zongfa/p/7709639.html https://www.cnblogs.com/c ...

    更多相关内容
  • PHP连接局域网MYSQL数据库的简单实例 PHP连接局域网MYSQL数据库的简单实例 [php] view plaincopy SQL中约束和触发器的停用与启用 如何对SQL中的约束和触发器进行停用与启用,如果有外键约束则相关联表都要进行相应...

    729971ea128fcb73bbc0a45bf0d61196.png

    解决方法:

    正常重启电脑试试看,如果不行,在用下面试试

    MYSQL 1053错误 解决方法:

    在DOS命令行使用

    第一步:

    运行 -> cmd + 回车 (输入下面的命令)

    mysqld-nt remove mysqlservice

    的方式卸载此服务,它提示卸载成功,(是英文成功的意思)

    注:如果提示失败,服务正在运行,在任务栏中结束mysqld-nt.exe

    第二步:

    mysqld-nt install mysqlservice

    重新注册服务,一切恢复正常。(也会英文显示成功)

    第三步:

    打开 服务>>>>禁用MYSQL>>>>再启动MYSQL

    Windows 无法启动xx服务 错误1053:服务没有及时响应启动或控制请求

    症状:win7系统的很多系统关键服务,启动不了,双击该服务也弹不了操作框,系统服务是设置为自动 的,但是就是启动不了,在本地服务窗口中只能启动该服务,但是双击会弹不了窗口,你点启动后会出现错误提示10 ...

    windows无法启动MySQL服务 错误1067

    启动wampmysqld 出现 1067 错误 解决方法:删除在MySQL安装目录下的Data目录中的ib_logfile0和ib_logfile1这两个文件. 重新启动MySQL服务

    在本地计算机无法启动MYSQL服务错误1067进程意外终止

    在本地计算机无法启动MYSQL服务错误1067进程意外终止 这种情况一般是my.ini文件配置出错了, 你可以删除系统目录下的my.ini文件, 把下面的内容重新写入my.ini文件试试, 要适当地改 ...

    Mysql 本地计算机无法启动 mysql 服务 错误 1067:进程意外终

    1.重装后启动mysql服务,提示 本地计算机无法启动 mysql 服务 错误 1067:进程意外终止. 2.查看mysql根目录下有一 计算机名.err 打开一看全是英文的错误提示: 3.根据其中的 ...

    Windows 无法启动MongoDB服务 错误1067:进程意外终止

    1:Windows 无法启动MongoDB服务 错误1067:进程意外终止 2:解决方法: 进入MongoDB安装目录\data\将此文件夹下的mongod.lock删除(网友提供解决方案,实验之后貌 ...

    windows下启动mysql服务的命令行启动和手动启动方法

    1.图形界面下启动mysql服务. 在图形界面下启动mysql服务的步骤如下: (1)打开控制面板->管理工具->服务,如下图所示: 可以看到Mysql服务目前的状态是未启动(未写已启动的 ...

    Windows无法启动MySQL服务,错误1067

    问题:mysql服务启动异常 找出原因 检查D:\mysql-5.6.20-winx64\data目录下client-02.err文件的错误信息(以err为后缀名的文件是mysql的日志文件) 修改配 ...

    windows无法启动MySQL服务报错1067的解决方法是怎样?

    方法一: 1.打开my.ini文件,找到default-storage-engine=InnoDB这一行,把它改成default-storage-engine=MyISAM.2.删除在MySQL安装目 ...

    windows下启动mysql服务

    当你无法连接你的mysql数据库时,或者因为某些原因导致与mysql数据库的连接丢失时,可通过以下方式启动mysql服务 1.命令行下启动mysql服务 以管理员身份运行cmd,进入mysql安装目录 ...

    随机推荐

    《你不知道的JavaScript》整理(二)——this

    最近在读一本进阶的JavaScript的书,这次研究了一下“this”. 当一个函数被调用时,会创建一个活动记录(执行上下文). 这个记录会包含函 ...

    C程序与Lua脚本相互调用

    Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见.本文分为3个部分:1.Windows ...

    Github注册账户

    这是注册页面: 注册完后应该会受到邮件,但我一直没有收到,换了邮箱也没有用 ± 账户可以登上去却没办法创建仓库.

    python中main&lpar;&rpar;函数写法

    顶顶大名的Guido van Rossum(Python之父)推荐的main写法: #!/usr/bin/python import sys import getopt class Usage(Exc ...

    SharePoint 2010 设置宽度1024px

    在模板页中找到 s4-workspace,设置class=”s4-nosetwidth“,然后再设置宽度为1024px:如果要居中,设置style=“margin:0 auto” 这样也会有一个问题: ...

    PHP连接局域网MYSQL数据库的简单实例

    PHP连接局域网MYSQL数据库的简单实例 [php] view plaincopy <?PHP /** * php连接mysql数据库 * by www.jbxue.com */ $conn= ...

    SQL中约束和触发器的停用与启用

    如何对SQL中的约束和触发器进行停用与启用,如果有外键约束则相关联表都要进行相应操作. ALTER TABLE TableName CHECK CONSTRAIT ALL --检查约束 ALTER T ...

    12 个 CSS 高级技巧汇总

    下面这些CSS高级技巧,一般人我可不告诉他哦. 使用 :not() 在菜单上应用/取消应用边框 给body添加行高 所有一切都垂直居中 逗号分隔的列表 使用负的 nth-child 选择项目 对图标使 ...

    最经典的常用拍照姿势大全,顶级POSE

    伸出手遮阳光.   捂住一只眼睛.   手放在最旁.这是一个极具诱惑的姿势 站立,背对镜头,扭过来,仰角拍, 俩手按在头两边,歪头,或者直头,表情一般都困惑,迷茫,咬下嘴唇效果更佳.         ...

    Windows下Visual Studio 2013编译Lua 5&period;2&period;3

    1.创建一个Visual C++的Empty Project,如果需要支持Windows XP将Platform Toolset设置为Visual Studio 2013 - Windows XP ( ...

    展开全文
  • 使用drop可以直接删除表,删除的时候先要删除外键表后才可以删除主键表,最后我学会使用 sql 语句对数据表进行插入、删除和修改数据。 实验题目: 实验三 数据库的查询 实验目的和要求: 掌握 SELECT 语句的基本语法...

    《数据库系统原理》教学上机实验报告

    实验题目:

    实验一 创建数据库与表

    实验目的和要求:

    1. 了解 mysql 数据库的存储引擎分类;
    2. 了解表的结构特点;
    3. 了解 mysql 的基本数据类型;
    4. 了解空值概念;
    5. 学会使用 sql 语句创建数据库和表。

    实验过程:
    1.实验题目
    创建用于企业管理的员工数据库,数据库名为 yggl,包含员工信息,部门信
    息及员工薪水信息。数据库 yggl 包含 3 个表:

    1. Employees: 员工信息表;
    2. Departments: 部门信息表;
    3. Salary: 员工薪水情况表。

    2.创建语句如下:
    (1)创建数据库

    create database yggl;
    use yggl;
    

    (2)创建表 departments

    create table Departments
    (
    DepartmentID char(3) NOT null,
    DepartmentName char(20) not null,
    Note text(16) ,
    primary key (DepartmentID)
    )engine=innodb;
    

    (3)创建表 employees

    create table employees
    (employeeid char(6) not null,
    name char(10) not null,
    education char(4),
    birthday date not null,
    sex char(2) not null,
    workyear tinyint(1) ,
    address varchar(20) ,
    phonenumber char(12),
    departmentid char(3) not null,
    primary key (employeeid)
    )engine=innodb;
    

    (4)创建表 salary

    create table salary
    (
    employeeid char(6),
    income float(8),
    outcome float(8),
    primary key (employeeid)
    )engine=innodb;
    

    该实验进行前,首先要明确,用户必须是系统管理员,或是被授权使用 create database语句的用户。
    其次,确定数据库包含哪些表,以及各表的结构,常用的 mysql 数据类型。

    实验结果:
    与实验预期相符。

    实验分析:
    通过本次实验,我了解 mysql 数据库的存储引擎分类和表的结构特点, 学会使用 sql 语句创建数据库和表;同时知道了创建数据库时用户必需拥有DBA权限和创建表时必须明确说明每一列的数据类型,可以是数值型,字符型,位串行,时间型。希望通过本次实验对数据库有了初步的了解。

    实验题目:

    实验二 表数据的插入,修改和删除

    实验目的和要求:

    1. 学会使用 sql 语句对数据表进行插入、删除和修改数据;
    2. 了解更新操作时要注意数据完整性;
    3. 了解 sql 语句对数据操作的灵活控制功能。

    实验过程:
    1.实验题目
    使用 sql 语句,向在上一个实验中建立的数据库 YGGL 的 3 个表插入多行数据,然后修改和删除一些记录。使用 SQL 进行有限制的修改和删除。

    要掌握 SQL 中用于对表数据进行插入、修改和删除命令分别 INSERT,UPDATE,DELETE。

    要特别注意在执行插入、删除和修改数据更新操作时,必须保证数据的完整性。命令行下的 SQL 语句在对表数据进行插入、修改删除时,比在图形界面下操作更灵活,功能更强大。

    2.实验步骤
    (1)使用 SQL 语句插入数据,向表 employees 插入数据。启动 mysql 客户端,在命令行中。
    入:

    insert into employees values('000001',' 王 林 ',' 大 专 ','1986-01-23','1',8,' 中山路
    32-1-508','83355668','2');
    insert into employees values('010008',' 伍 容 华 ',' 本 科 ','1988-03-28','1',3,' 北京东路
    100-2','83321321','1');
    

    以上两行数据,并没有明确要求列出列名,所以各列值及类型要和表中的列一一对应。

    insert into employees
    (employeeid,name,education,birthday,sex,workyear,address,phonenumber,departmentid)
    values('020018','王向容','硕士','1982-12-09','1',2,'四牌楼 10-0-108','83792361','1');
    

    以上命令在插入数据的过程中明确了列名和值的对应关系。
    也可以同时插入多行数据, 如上所示, 多行值中间以逗号分割:

    insert into employees
    (employeeid,name,education,birthday,sex,workyear,address,phonenumber,departmentid)
    values('102201','刘明','本科','1978-07-30','1',3,'虎距路 100-2','83606608','5'),
    ('020010','李丽','大专','1972-10-18','1',3,'中山东路 102-2','83413301','1');
    

    温馨提示: 在查看运行结果的时候如果出现乱码(不管是命令行还是图形界面下)试用
    show variables like 'char%';和 show variables like 'collation_%';来查看一下 mysql 的数据使用编码!
    至于怎么解决编码不一致导致的乱码问题,可以作为一个问题由同学们通过查询相关文献、网络资源自行解决以提高自我学习能力。更深入的了解可以查询字符编码相关知识。

    (2)删除一行

    delete from employees where Employeeid='000001';
    
    

    (3)修改一行

    insert into employees values('000002',' 容 华 ',' 本 科 ','1988-03-28','0',3,' 北 京 东 路
    100-2','83321321','1');
    update employees set address=' 北 京 西 路
    100-2',phonenumber='83321320',departmentid='2' where employeeid='000002';
    

    (4)替换已经存在的行

    insert into Departments values ('1','广告部','负责推广产品');
    replace into Departments values ('1','广告 2 部','负责推广产品');
    

    总结:有 向表中“替换插入”一条数据,如果原表中没有 id=1 这条数据就作为新数据插入相当于 insert into 作用);如果原表中有 id=1 这条数据就做替换(相当于 update 作用)。对于没有指定的字段以默认值插入。
    (5)删除表中所有的行
    truncate table salary谨慎操作此命令。

    实验结果:
    与预期实验相符。

    实验分析
    通过本次实验,我了解了更新操作时要注意数据完整性;知道了sql 语句对数据操作的灵活控制功能,同时Set可一次多个列的列值,不同列之间用逗号隔开。Where子句也可以嵌入子查询。使用drop可以直接删除表,删除的时候先要删除外键表后才可以删除主键表,最后我学会使用 sql 语句对数据表进行插入、删除和修改数据。

    实验题目:

    实验三 数据库的查询

    实验目的和要求:

    1. 掌握 SELECT 语句的基本语法;
    2. 掌握子查询的表示;
    3. 掌握连接查询的表示;
    4. GROUP BY 子句的作用和使用方法;
    5. ORDER BY 子句的作用和使用方法;
    6. LIMIT 子句的作用和使用方法。

    实验过程:
    1 .ELECT 语句的基本使用
    (1)查询每个雇员的数据,

    use yggl; 选择数据库
    select * from employees;
    

    (2)查询每个雇员的姓名,地址和电话

    Select name,address,phonenumber from employees;
    

    (3)查询 employeeid 为 为 000001 的雇员的地址和电话

    select address ,phonenumber from employees where employeeid='000001';
    

    (4)查询 employess 表中女雇员的地址和电话,使用 AS 字句将结果中各列的标题分别指
    定为地址,电话。

    select address as 地址,phonenumber as 电话 from employees where sex='0';
    

    (5)查询 employees 表中员工的姓名和性别,要求 sex 值为 1 时显示为男,为 0 时显示为女 (把 实际上是把 SEX 列的由 值由 0 和 和 1 改变为时 男和女,同时 sex 列名也 被显示 为性别)。

    select name as 姓名,case
    when sex='1' then '男'
    when sex='0' then '女'
    end
    as 性别 from employees;
    

    (6)获取员工 总数

    select count(*) from employees;
    

    (7)找出所有姓王的雇员的部门号 和 姓名

    select name, departmentid from employees
    where name like '王%';
    

    (8)在 找出所有收入在 2000~3000 元之间的员工号码,

    Select employeeID from salary Where income between 2000 and 3000;
    

    思考与练习: :找出所有部门号是 1 或 2 的工作的雇员的号码。

    2.子查询的使用,
    (1)查找在财务部工作的雇员的情况

    Select * From employees Where departmentId=( Select DepartmentId From departments
    Where departmentname='财务部');
    

    (2 )查找研发部年龄不低于市场部所有雇员年龄的雇员的姓名

    select name From employees Where departmentId in
    ( Select departmentid from departments where
    departmentname='研发部')
    and
    Birthday<=all( Select birthday from employees where departmentID in
    ( Select departmentid from departments where
    departmentname='市场部'));
    

    (3)查找比广告部所有的雇员收入都高的雇员的姓名

    select name from employees where employeeid in (
    select employeeid from salary where income>all(
    select income from salary where employeeid in (
    select employeeid from employees where departmentID=(
    select departmentID from departments where departmentname='广告部')
    )
    )
    );
    

    3 连接查询的使用
    (1)查询每个雇员的情况及薪水的情况

    select employees.*,salary.* from employees ,salary where
    employees.employeeid=salary.employeeid;
    

    (2)使用内连接的方法查询名字为“王林”的 员工所在部门

    select departmentname from departments join employees on
    departments.departmentID=employees.departmentID where employees.name='王林';
    

    (3) 查找广告部收入在 2000 元 元 以上 的雇员姓名及薪水详情

    select name,income,outcome from employees,salary,departments
    where employees.employeeID=salary.employeeID
    and
    employees.departmentID=departments.departmentID
    and
    departmentname='广告部'
    and
    income>2000;
    

    4 .GROUP BY ,ORDER BY 和 和 LIMIT 子句的使用
    (1)查找 employees 中男性和女性的人数

    select sex,count(sex)
    from employees
    group by sex;
    

    (2)查找员工数超过 2 人的部门名称和员工数量

    select departmentname ,count(*) as 人数
    from employees,departments
    where employees.departmentID=departments.departmentID
    group by employees.departmentid
    having count(*)>2;
    

    (3)将 Employees 表中的员工号码由大到小排列

    select employeeid
    from employees
    order by employeeid desc;
    

    实验结果:
    与预期实验结果相符。

    实验分析:
    通过本次实验,我了解了 SELECT 语句的基本语法,知道了子查询的表示;同时学会了模糊查询法要用%,如like “刘%”,分组group by要用havving来限制,Order by是排序要求,desc是升序,asc是降序,最后掌握连接查询的表示。

    实验题目:

    实验四 视图的使用

    实验目的和要求:

    1. 熟悉视图的概念和作用,
    2. 掌握视图的创建方法
    3. 掌握如何查询和修改视图,

    实验过程:
    1 .创建视图
    (1)创建 yggl 数据库上的视图 ds_view ,视图包含 departments 表的全部列。

    create or replace
    view ds_view
    as select * from departments;
    

    (2)建 创建 yggl 数 数图 据库上的视图 employees_view 视图,包含。 员工的号码,姓名和实际收入。

    create or replace
    view employees_view (employeeID,name,realincome)
    as
    select employees.employeeid,name,income-outcome
    from employees,salary
    where employees.employeeID=salary.employeeID;
    
    

    2 .查询视图
    (1)从视图 ds_view 中查询出部门号为 3 的部门名称

    select departmentname
    from ds_view
    where departmentid='3';
    

    (2) 从视图 employees_view 中查询姓名为‘王林’的员工的实际收入

    select realincome
    from employees_view
    where name='王林';
    

    3 ,更新视图,
    (1)在更新视图前需要了解可更新视图的概念,了解什么视图是不可以进行修改的。更新视图真正更新的是与视图关联的表。

    insert into ds_view values('6','财务部','财务管理');
    

    执行完该命令使用 select 语句分别查询视图 ds_view 和基本表 department,查看其中发生了什么变化,尝试,向试图 employees_view 中插入一行数据,看看会发生什么情况。
    (2)修改视图 ds_view, 将部门号为 5 的部门名称修改为‘生产车间’。

    update ds_view
    set departmentname='生产车间'
    where departmentid='5';
    

    执行完该命令,使用 select 语句查看视图 ds_view 和基本表 department 发生的变化。
    (3)修图 改视图 employees_view 中号码为 000001 的雇员的姓名为‘王浩’

    update employees_view
    set name='王浩'
    where employeeid='000001';
    

    (4)图 删除视图 ds_view 中部门号为‘6 ’的数据

    delete from ds_view
    where departmentid='6';
    

    (5)删除视图

    drop view ds_view;
    

    (6)在界面工具中操作视图。

    实验结果:
    与实验预期结果相符。

    实验分析:
    通过本次实验,我熟悉了视图的概念和作用,了解了视图的创建方法,同时知道了视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已经定义好的视图上,或建立在基本表与视图上,创建试图后,若删除了到处此视图的基本表,则该视图会失效,最后掌握如何查询和修改视图。

    实验题目:

    实验五 索引和数据完整性

    实验目的和要求:

    1. 掌握索引的使用方法
    2. 掌握数据完整性的实现方法

    实验过程:
    1 ,创建索引
    (1)使用 create index 语句创建索引
    ① 对 yggl 数据库的 employees 表中的 DepartmentID 建立索引

    create index depart_ind
    on employees(departmentid);
    

    ② 在 employees 表的 name 列和 Address 列上建立复合索引

    create index ad_ind
    on employees(name,address);
    

    ③ 对 departments 表上的 departmentname 列建立唯一索引

    create unique index dep_ind on
    departments(departmentname);
    

    (2)使用 ALTER TABLE 语句向表中添加索引
    ① employees 表中的出生日期内添加一个唯一性索引,姓名列和性别列上添加一个复
    合索引

    alter table employees
    add unique index date_ind(birthday),
    add index na_ind(name,sex);
    

    ② 假设 departments 表,没有主键,用 alter table 语句将 departmentID 设为主键

    alter table departments
    add primary key (departmentID);
    

    (3)在创建表时创建索引,
    创建与departments表相同结构的表departments1,将departments1的Department.name
    设为主键,对 Department.ID 上建立一个索引。

    create table department1
    (
    departmentid char(3),
    departmentname char(20),
    note text,
    primary key (departmentname),
    index DID_ind(departmentid)
    );
    

    2 .删除索引
    (1)使用 drop index 语句删除表 employees 上的索引 depart_ind.

    drop index depart_ind on employees;
    

    (2)使用 用 alter table 语句删除 Departments 上的主键和索引

    alter table departments
    drop primary key,
    drop index dep_ind;
    

    3.数据完整性
    (1)创建一个表 employees3 ,只含 employeeID 、 name 、 sex 和 和 education 列, 将 name列 设为主键作为列 name 的 的 完整性约束,employeeID 为替代键作为表的完整性约束。

    create table employees3
    (
    employeeID char(6) not null,
    name char(10) not null primary key,
    sex tinyint(1),
    education char(4) ,
    unique(employeeid)
    );
    

    (2)创建一个表 salary1 ,要求所有 salary 表出中的 出现的 employeeid 都要出现在 salary1 的表中,利用完整约束实现,要求当删除或改 修改 salary 表上的 employeeid 列时,salary1表中employeeID 的值也会随之变化,

    create table salary1
    (
    employeeid char(6) not null primary key,
    income float(8) not null ,
    outcome float(8) not null,
    foreign key (employeeid) references salary (employeeid)
    on update cascade
    on delete cascade
    );
    

    思考与练习: :

    1. 创建完 salary1 表后,初始化该表的数据与 salary 表相同(insert salary1 select * from
      salary;),删除 salary 表中的一行数据,再查看 salary1 表的内容,看看会发生什么
      情况
    2. 使用 alter table 语句向 salary 表中的 employeeid 添加一个外键,要求当 employees
      表中要删除或修改与employeeID值有关的行时,检查salary表有没有该employeeID
      值,如果存在则拒绝更新 employees 表
      3 )创建表 student ,只考虑学号和性别两列性别只 能包含男和女,
    create table student
    ( 学号 char(6) not null,
    性别 char(1) not null,
    check(性别 in ('男','女'))
    );
    

    CHECK 语句在声明中并未起到作用,为什么呢? 原因是因为,不同于 SQLServer,在MYSQL 中,CHECK 只是一段可调用但无意义的子句。MySQL 会直接忽略,CHECK 子句会被分析,但是会被忽略。接受这些子句但又忽略子句的原因是为了提高兼容性,以便更容易地从其它 SQL 服务器中导入代码。

    实验结果:
    与实验预期结果相符。

    实验分析:
    通过本次实验,我了解了索引的使用方法,如果删除了表中的一个或多个列,该列上的索引也会受到影响,如果组成索引的所有列都被删除,则该索引也被删除。索引创建完后,可以使用 show index from table_name 语句查看表中的索引,最后掌握数据完整性的实现方法。

    实验题目:

    实验六 mySQL语言结构

    实验目的和要求:

    1. 掌握变量的分类及其使用;
    2. 掌握各种运算符的使用;
    3. 掌握系统内置函数的使用。

    实验过程:
    (1)常量的使用
    ① 计算 194 和 142 的成绩

    select 194*142
    

    ② 获取一下这串字母的值,

    select 'I\nlove\nmysql';
    

    如果 SQL 服务器模式启用了 NSI_QUOTES,可以只用单引号引用字符串,此时用双引
    号引用的字符串被解释为一个识别符。
    (2)系统变量的使用
    ① 获得现在使用的 Mysql 的版本

    select @@version
    

    ② 获得系统的当选时间

    select current_time;
    

    mysql 系统变量包括全局变量(global)和会话变量(session),global 变量对所有 session
    生效,session 变量包括 global 变量。mysql 调优必然会涉及这些系统变量的调整,所以我们首先得会查询系统变量。
    1、查询全局变量:show global variables ;
    2、查询会话变量:show session variables \G;或 show variables;
    (3)用户变量的使用
    ① 对于实验 1,2 给出的数据库表结构,创建一个名为 female 的用户变量,并在 select
    语句中使用该局部变量查找表中所有女员工的编号姓名,

    use yggl;
    set @female=0;
    select employeeid,name
    from employees
    where sex=@female;
    

    ② 定义一个变量,用于获取号码为 102201 的员工的电话号码,

    set @phone=(select phonenumber from employees where employeeid='102201');
    select @phone;
    

    (4)运算符的使用
    ① 使用算术运算符减号查询员工的实际收入,

    select income-outcome from salary;
    

    ② 使用比较运算符>查询 employees 表中工作时间大于 5 年的员工信息,

    select *
    from employees where workyear>5;
    

    (5)系统内置函数的使用
    ① 求广告部雇员的总人数

    select count(employeeid) as 广告部人数
    from employees where departmentid=(
    select departmentid
    from departments
    where departmentname='广告部');
    

    附:函数目录 附:函数目录( 非全部)
    1 、数学函数
    (1) greatest(),least():求最大、最小值
    (2) floor(),ceiling():取整数
    (3) round():四舍五入 truncate():数字截取
    (4) abs():取绝对值
    (5) sign():返回数值的符号
    (6) sqrt():返回一个数的平方根
    2 、字符串函数
    (1) ascii(char):返回字符的 ASCII 值
    (2) char(x1,x2,……):将 ASCII 值转换为字符并组成一个字符串
    (3) left|right(str,X):返回字符串的左边或右边 X 个字符
    (4) trim|Ltrim|Rtrim(str):删除字符串两端空格
    (5) replace(str1,str2,str3):用 str3 替换 str1 中所有出现 str2 的地方
    (6) substring(str,Start,length):返回字符串 str 中从 Start 开始长度为 Length 的字符串
    3 、日期和时间函数
    (1) now():返回当前的日期时间
    (2) curtime(),curdate():分别返回当前的时间和日期
    (3) year(dstr):返回日期值 dstr 中年的部分
    (4) month(),monthname():返回日期值中月份的数字或英文
    (5) day(),dayname():返回日期值中的天的数字或者星期名
    4 、加密函数
    (1) AES_encrypt|AES_decrypt(str,key):返回字符串 str 用密钥 key 进行高级加密 AES 算法加密或解密的结果
    (2) encode|decode(str,key):返回对字符串 str 进行加密和解密的结果
    (3) password(str):返回字符串 str 加密后的密码字符串,主要用于 mysql 认证系统。
    5 、控制流函数
    (1) if(exp1,exp2,exp3):
    该函数有 3 个参数,第 1 个为要被判断的表达式,当表达式为真返回第 2 个参数,当表达式为假时返回第 3 个参数。
    (2)IFNULL 和 和 NULLIF 函数
    IFNULL 函数的语法格式为:IFNULL(expr1,expr2)此函数的作用是:判断参数 expr1 是否为
    NULL
    6 、格式化函数
    (1)FORMAT()函数语法格式:
    FORMAT(x, y)
    FORMAT()函数把数值格式化为以逗号间隔的数字序列。FORMAT()的第一个参数 x 是被格
    式化的数据,第二个参数 y 是结果的小数位数。
    (2)DATE_FORMAT()和 TIME_FORMAT()函数
    DATE_FORMAT()和 TIME_FORMAT()函数可以用来格式化日期和时间值。
    语法格式:
    DATE_FORMAT/ TIME_FORMAT(date | time, fmt)
    其中,date 和 time 是需要格式化的日期和时间值,fmt 是日期和时间值格式化的形式(3)INET_NTOA()和 INET_ATON()函数
    MySQL 中的 INET_NTOA()和 INET_ATON()函数可以分别把 IP 地址转换为数字或者进行相反的操作
    7、 类型转换函数
    MySQL 提供 CAST()函数进行数据类型转换,它可以把一个值转换为指定的数据类型。
    语法格式:
    CAST(expr, AS type)
    expr 是 CAST 函数要转换 的值,type 是转换后的数据类型。
    8 、系统信息函数
    (1)DATABASE()、USER()和 VERSION()函数可以分别返回当前所选数据库、当前用户和
    MySQL 版本信息:
    select DATABASE(),USER(), VERSION();
    (2)BENCHMARK() 函数用于重复执行 n 次表达式 expr。它可以被用于计算 MySQL 处理表达式的速度,结果值通常为零。
    (3)FOUND_ROWS()函数用于返回最后一个 SELECT 语句返回的记录行的数目

    实验结果:
    与实验预期结果相符。

    实验分析:
    通过本次实验,我了解了变量的分类及其使用,学会了各种运算符的使用,掌握了系统内置函数的使用,同时如果 SQL 服务器模式启用了 NSI_QUOTES,可以只用单引号引用字符串,此时用双引号引用的字符串被解释为一个识别符,算数运算符在数据数据中的实现方法比较简单。希望自己继续加油,提高自己。

    实验题目:

    实验七 备份与恢复

    实验目的和要求:

    1. 掌握使用 sqL 语句进行数据库完全备份的方法
    2. 掌握使用客户端程序进行完全备份的方法。

    实验过程:
    (1)用 SQL 语句进行 数据库备份和恢复使用 SQL 语句只能备份和恢复表的内容,如果表的结构损坏,则要先恢复表的结构才能恢复数据。
    ① 备份
    备份 YGGL 数据库中的 Employees 表到 D 盘的 file 文件夹下,使用如下语句:

    use yggl;
    select * from employees
    into outfile 'D:/wamp64/tmp/employees.txt';
    

    执行完后查看 D 盘 file 文件夹下是否有 employees.txt 文件。
    注意: MYSQL 导入数据出现 The MySQL server is running with the --secure-file-priv option so it cannot execute this statement。
    这个问题解决起来其实很简单,是因为在安装 MySQL 的时候限制了导入与导出的目录权限,只能在规定的目录下才能导入。
    我们需要通过下面命令查看 secure-file-priv 当前的值是什么,查阅官方文档,
    secure_file_priv 这个参数用于限制数据的导入和导出,例如 LOAD DATA 或者 SELECT … INTO OUTFILE 以及 LOAD_FILE()函数,要想执行以上操作用户需要具有 FILE 权限。 secure_file_priv
    可以设置为如下: 如果为空,则此参数没有作用,即不做限制。如果设置为目录,则数据的导入导出就只会限制在此目录中,并且这个目录必须事先存在,服务器并不会创建它 如果设为 NULL,服务器会禁止数据的导入导出操作。

    show variables like '%secure%';
    
    

    使用完上述命令后,那么我们把导入的路径改为上面的值就可以了!

    ② 恢复
    为了方便说明问题,先删除 employee 语句表中的几行数据,再使用 sql 语句恢复employees 表。

    delete from employees where employeeID='102201';
    load data infile 'D:/wamp64/tmp/employees.txt'
    replace into table employees;
    

    执行完后使用 SELECT 查看 employees 表的变化
    (2)使用客户端工具备份和恢复表
    使用客户端工具首先要打开客户端工具的运行环境:打开命令行窗口,进入 mysql 的
    bin 目录,使用如下命令:

    D:\wamp64>cd bin
    D:\wamp64\bin>cd mysql/mysql5.7.21
    D:\wamp64\bin\mysql\mysql5.7.21>cd bin
    D:\wamp64\bin\mysql\mysql5.7.21\bin>
    

    ① 使用 mysqldump 工具备份表和数据库。
    mysqldump 工具备份的文件中包含了创建表结构的 SQl 语句,要备份数据库 YGGL 中的
    salary 表,在客户端输入以下命令:

    mysqldump -h localhost -u root -p YGGL salary>D:/wamp64/tmp/salary.sql
    

    要备份整个 YGGL 数据库,可以使用以下命令:

    mysqldump -u root -p --databases YGGL>D:/wamp64/tmp/YGGL.sql
    

    ② 使用 mysql 恢复数据库
    为了方便查看效果,先删除 YGGL 数据库中的 employees 表,然后使用以下命令:

    mysql -u root -p YGGL<D:/wamp64/tmp/YGGL.sql
    

    查看表是否恢复。
    mysqlimport 的功能和 load data infile 语句是一样的

    实验结果:
    与预期实验结果相符。

    实验分析:
    通过本次实验,我知道了使用 sqL 语句进行数据库完全备份的方法,学会了利用日志技术进行数据库恢复时,恢复子系统必须搜索日志,确定哪些事务需要REDO,哪些事务需要 UNDO。一般来说,我们需要检查所有日志记录。这样做具有两个问题。一是搜索整个日志将耗费大量的时间。二是很多需要 REDO 处理的事务实际上已经将它们的更新操作结果写到数据库中了,然而恢复子系统又重新执行了这些操作,浪费了大量时间。为了解决这些问题,又发展了具有检查点的恢复技术,最后掌握使用客户端程序进行完全备份的方法。

    实验题目:

    实验八 数据库的安全性

    实验目的和要求:

    1. 掌握数据库用户账号的建立与删除方法
    2. 掌握数据库用户权限的授予方法

    实验过程:
    (1)创数据库用户
    ① 创建数据库用户 user1 和 user2 密码都为 1234, 在 Mysql 客户端中使用以下 sql
    语句:

    create user
    'user1'@'localhost' IDENTIFIED by '1234',
    'user2'@'localhost' IDENTIFIED by '12345';
    

    查看所有的用户 select user,host from mysql.user;
    ② 将用户名 user2 的名称修改为 user3。

    rename user
    'user2'@'localhost' TO 'user3'@'localhost';
    

    ③ 将用户 user1 的密码修改为 123456。

    set password for 'user1'@'localhost' = password('123456');
    

    ④ 删除用户 user3

    drop user 'user3'@'localhost';
    

    ⑤ 以 user1 用户身份登录 Mysql,
    打开另一个新的命令行窗口,然后进入 mysql 安装目录的 bin 下输入命令,

    mysql -hlocalhost -uuser1 -p1234
    select user(); 
    

    可查看当前登录 mysql 的用户
    思考与练习

    1. 刚刚创建的用户有什么样的权限
    2. 创建一个用户,并以该用户的身份登录。
      (2)用户权限的授予与回收
      ① 授予用户 user1 对 yggl 数据库中 employees 表的所有操作权限及查询操作权限,以
      系统管理员 root 身份输入以下 sql 语句:
    use yggl;
    grant all on employees to user1@localhost;
    grant select on employees to user1@localhost;
    

    ② 授予用户 user1 对 employees 表进行插入,修改,删除操作权限

    use yggl;
    grant insert,update,delete on employees to user1@localhost;
    

    ③ 授予用户 user1 对数据库 Yggl 的所有权限

    use yggl;
    grant all
    on * to user1@localhost;
    

    ④ 授予 user1 在 salary 表上的 select 权限,并允许其将该权限授予其他用户。

    Grant select
    on yggl.salary
    to user1@localhost identified by '1234'
    with grant option;
    

    执行完后,可以以 user1 用户身份登录 mysql 客户端,user1 用户可以使用 grant 语句,将自己在该表上所拥有的全部权限授予其他用户。
    ⑤ 回收 user1 的,employees 表上的 select 权限

    revoke select
    on employees
    from user1@localhost;
    

    思考与练习:

    1. 思考表权限,列权限,数据库权限和用户权限的不同之处。
    2. 授予用户 user1 所有的用户权限。
    3. 取消用户 user1 所有的权限。
      (3)使用图形界面(phpadmin, 或者 MYSQL Administrator、 、Navicat )创建用户并授予权限,请自己参考相关文献进行操作。
      MYSQL 常用图形操作工具介绍:
      (1) phpMyAdmin(http://www.phpmyadmin.net/)
      phpMyAdmin 是最常用的 MySQL 维护工具,是一个用 PHP 开发的基于 Web 方式架构在网站主机上的 MySQL 管理工具,支持中文,管理数据库非常方便。不足之处在于对大数据库的备份和恢复不方便。
      (2) Navicat(http://www.navicat.com/)
      Navicat 是一个桌面版 MySQL 数据库管理和开发工具。和微软 SQLServer 的管理器很像,易学易用。Navicat 使用图形化的用户界面,可以让用户使用和管理更为轻松。支持中文。

    实验结果:
    与预期实验结果相符。

    实验分析:
    通过本次实验,我了解了数据库用户账号的建立与删除方法 ,掌握了数据库用户权限的授予方法,同时知道了数据库安全可分为两类:系统安全性和数据安全性。系统安全性是指在系统级控制数据库的存取和使用机制。该机制包括有效的用户名/口令的组合、用户是否被授权可连接数据库,用户对象可用的磁盘空间大小,用户的资源限制、数据库审计是否有效、用户可执行哪些系统操作等。通过代码的编写,提高了自己的编程能力。

    展开全文
  • Mysql性能优化

    2018-04-14 11:23:44
    一.数据库优化的几个方向a.表的设计合理(符合 3NF)b.适当的添加索引(四种:普通索引,主键索引,唯一索引unique,全文索引,空间索引)c.分表技术(水平分割,垂直分割)d.读写分离e.存储过程(模块化编程,可以...

    一.数据库优化的几个方向

    a.表的设计合理(符合 3NF)

    b.适当的添加索引(四种:普通索引,主键索引,唯一索引unique,全文索引,空间索引)

    c.分表技术(水平分割,垂直分割)

    d.读写分离

    e.存储过程(模块化编程,可以提高速度,但是移植性不好)

    为什么存储过程比一般的sql的速度要快?

    因为mysql的结构是有三层在执行sql语句的时候其实首先是把sql语句发给数据库管理系统,数据库管理系统首先进行编译成二进制语句,最后才进行执行sql语句,因为数据库管理系统在编译的时候速度是比较慢的,所以人们就想了一个办法在数据库管理系统首先生成一个编译好的sql,然后每次执行这个sql就很方便了,这种方法就是存储过程

    f.对mysql配置的优化(配置最大的并发数my.ini,调整缓存大小)

    g.mysql服务器的硬件升级

    h.定时的去清除不需要的数据,要定时的进行碎片处理(MyISAM)


    什么样的表才是符合三范式?

    1)表的范式首先满足第一范式才能满足二范式,进一步才能满足第三范式

    1NF:表的列具有原子性,不能再分割。(只要数据库是关系型数据库就自动满足了一范式)

    2NF:表的数据具有唯一性,通常设置字段的主键(主键一般不含业务逻辑,一般是自增长)

    3NF : 表中不能留冗余数据,就是说表的信息如果能推导出来,就不应该单独的设计一个字段来存放


    二.sql优化的一般步骤

    1.开启慢查询日志

    1)简介

        开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。

    2)参数说明

       slow_query_log 慢查询开启状态
        slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)

        long_query_time 查询超过多少秒才记录

    3)设置步骤

    a.查看慢查询相关参数

    复制代码
    mysql> show variables like 'slow_query%';
    +---------------------------+----------------------------------+
    | Variable_name             | Value                            |
    +---------------------------+----------------------------------+
    | slow_query_log            | OFF                              |
    | slow_query_log_file       | /mysql/data/localhost-slow.log   |
    +---------------------------+----------------------------------+
    
    mysql> show variables like 'long_query_time';
    +-----------------+-----------+
    | Variable_name   | Value     |
    +-----------------+-----------+
    | long_query_time | 10.000000 |
    +-----------------+-----------+
    复制代码

    b.设置方法
    方法一:全局变量设置
    将 slow_query_log 全局变量设置为“ON”状态

    mysql> set global slow_query_log='ON'; 

    设置慢查询日志存放的位置

    mysql> set global slow_query_log_file='/usr/local/mysql/data/slow.log';

    查询超过1秒就记录

    mysql> set global long_query_time=1;

    方法二:配置文件设置
    修改配置文件my.cnf,在[mysqld]下的下方加入

    [mysqld]
    slow_query_log = ON
    slow_query_log_file = /usr/local/mysql/data/slow.log
    long_query_time = 1

    c.重启MySQL服务

    service mysqld restart

    d.查看设置后的参数

    复制代码
    mysql> show variables like 'slow_query%';
    +---------------------+--------------------------------+
    | Variable_name       | Value                          |
    +---------------------+--------------------------------+
    | slow_query_log      | ON                             |
    | slow_query_log_file | /usr/local/mysql/data/slow.log |
    +---------------------+--------------------------------+
    
    mysql> show variables like 'long_query_time';
    +-----------------+----------+
    | Variable_name   | Value    |
    +-----------------+----------+
    | long_query_time | 1.000000 |
    +-----------------+----------+

    4)测试

     a.执行一条慢查询SQL语句

    mysql> select sleep(2);

    b.查看是否生成慢查询日志

    ls /usr/local/mysql/data/slow.log

    如果日志存在,MySQL开启慢查询设置成功!


    2.explain用法和实践

    explain对我们优化sql语句是非常有帮助的。可以通过explain+sql语句的方式分析当前sql语句。

    例子

    EXPLAIN SELECT dt,method,url FROM app_log WHERE id=11789

    table

    显示这一行数据属于哪张表,若在查询中为select起了别名,则显示别名。

    EXPLAIN SELECT dt,method,url FROM app_log AS temp WHERE id=11789

    type

    在表里查到结果所用的方式。包括(性能有差——>高): All | index | range | ref | eq_ref | const,system | null |

    all:全表扫描,MySQL 从头到尾扫描整张表查找行。

    EXPLAIN SELECT dt,method,url FROM app_log AS temp LIMIT 100

    注意:这里虽然使用limit但并不能改变全表扫描。

    index:按索引扫描表,虽然还是全表扫描,但优点是索引是有序的。

    EXPLAIN SELECT id FROM app_log AS temp LIMIT 100

    range:以范围的方式扫描索引。比较运算符,以及in的type都是range。

    EXPLAIN SELECT * FROM app_log AS temp WHERE id>100 LIMIT 199

    eq_ref:使用唯一性索引查找(主键或唯一索引)

    EXPLAIN SELECT * FROM app_log JOIN app_details_log USING(id)

    先全表扫描了app_details_log表,然后在对app_log进行eq_ref查找。因为app_log的id字段是主键。如果此时删除app_log的id为主键,则都会进行全表扫描。

    const:常量,在整个查询过程中这个表最多只会有一条匹配的行,比如主键 id=1 就肯定只有一行,只需读取一次表数据便能取得所需的结果,且表数据在分解执行计划时读取。

    EXPLAIN SELECT * FROM app_log WHERE id=11790

    注意:system 是 const 类型的特例,当表只有一行时就会出现 system

    null:在优化的过程已经得到结果,不再需要访问表或索引。例如表中并不存在id=1000的记录。

    EXPLAIN SELECT * FROM app_log WHERE id=1000

    possible_keys

    可能被用到的索引。

    EXPLAIN SELECT * FROM app_log  WHERE id>100 LIMIT 100 ;

    Key

    查询过程中实际用到的索引,例子如上图,实际用的索引列为主键列。

    key_len

    索引字段最大可能使用的长度。例如上图中,Key_len:4,因为主键是int类型,长度为4.

    ref

    指出对key列所选择的索引的查找方式,常见的有const,func,null,具体字段名。当key列为null,即不使用索引时,此值也为null.

    rows

    mysql估计需要扫描的行数,只是一个估算。

    using Index:此查询使用了覆盖索引(Convering Index),即通过索引就能返回结果,无需访问表。若没显示“Using Index”表示读取了表数据。

    EXPLAIN SELECT id FROM app_log;

    因为 id 为主键索引,索引中直接包含了 id 的值,所以无需访问表,直接查找索引就能返回结果。


    using where:mysql从存储引擎收到行后再进行“后过滤(Post-filter)”。后过滤:先读取整行数据,再检查此行是否符合where的条件,符合就留下,不符合便丢弃。检测是在读取行后进行的,所以叫后过滤。

    EXPLAIN SELECT id FROM app_log WHERE id>100 LIMIT 100;

    using temporary:使用到临时表,在使用临时表的时候,Extra为这个值。

    using filesort:若查询所需的排序与使用的索引的排序一样,因为索引已排序,因此按索引的顺序读取结果返回,否则,在取到结果后,还需要按查询所需的顺序对结果进行排序,这时就会出现using filesort。

    EXPLAIN SELECT id FROM app_log WHERE id>100 GROUP BY dt;

    一个优化的例子

    我需要对app_log的表按时间进行分组,显示每个小时的人数。

    通过上面你可以看到type一个为all,一个为range。为all的查询需要23+s,而下面的则只需要0.3s。通过rows也能看出优化后,表扫描的行数变化。

    3.索引的使用

       1) 创建索引的几种方式

       Mysql目前主要有以下几种索引方式:FULLTEXT,HASH,BTREE,RTREE。

       那么,这几种索引有什么功能和性能上的不同呢?详情点击下面链接:

       http://blog.sina.com.cn/s/blog_4aca42510102v5l2.html

       2)常用索引类型

       Mysql常见索引有:主键索引(主键自带索引功能)、唯一索引、普通索引、全文索引、组合索引(联合索引,多列索引) 

      这些索引的使用技巧及注意事项

      索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型

      

    在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表:

    复制代码代码如下:
    CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL  );

    我们随机向里面插入了10000条记录,其中有一条:5555, admin。

    在查找username="admin"的记录 SELECT * FROM mytable WHERE username='admin';时,如果在username上已经建立了索引,MySQL无须任何扫描,即准确可找到该记录。相反,MySQL会扫描所有记录,即要查询10000条记录。

    索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。

    MySQL索引类型包括:

    a.普通索引

    这是最基本的索引,它没有任何限制。它有以下几种创建方式:

    1.创建索引

    复制代码代码如下:
    CREATE INDEX indexName ON mytable(username(length));

    如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。

    2.修改表结构

    复制代码代码如下:

    ALTER mytable ADD INDEX [indexName] ON (username(length)) -- 创建表的时候直接指定

    CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   INDEX [indexName] (username(length))   ); 

    -- 删除索引的语法:

    DROP INDEX [indexName] ON mytable;


    b.唯一索引

    它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

    复制代码代码如下:
    CREATE UNIQUE INDEX indexName ON mytable(username(length)) 
    -- 修改表结构
    ALTER mytable ADD UNIQUE [indexName] ON (username(length)) 
    -- 创建表的时候直接指定
    CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   UNIQUE [indexName] (username(length))   );

    c.主键索引

    它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

    复制代码代码如下:
    CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   PRIMARY KEY(ID)   );

    当然也可以用 ALTER 命令。记住:一个表只能有一个主键。

    d.组合索引

    为了形象地对比单列索引和组合索引,为表添加多个字段:

    复制代码代码如下:
    CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   city VARCHAR(50) NOT NULL,   age INT NOT NULL  ); 

    为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将 name, city, age建到一个索引里:

    复制代码代码如下:
    ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);[code]
    建表时,usernname长度为 16,这里用 10。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。

    如果分别在 usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。

    建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:

    usernname,city,age   usernname,city   usernname  为什么没有 city,age这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:
    [code]
    SELECT * FROM mytable WHREE username="admin" AND city="郑州"  SELECT * FROM mytable WHREE username="admin"

    而下面几个则不会用到:

    复制代码代码如下:

    SELECT * FROM mytable WHREE age=20 AND city="郑州"  SELECT * FROM mytable WHREE city="郑州"

    f.建立索引的时机

    到这里我们已经学会了建立索引,那么我们需要在什么情况下建立索引呢?一般来说,在WHERE和JOIN中出现的列需要建立索引,但也不完全如此,因为MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。例如:

    复制代码代码如下:
    SELECT t.Name  FROM mytable t LEFT JOIN mytable m    ON t.Name=m.username WHERE m.age=20 AND m.city='郑州'

    此时就需要对city和age建立索引,由于mytable表的userame也出现在了JOIN子句中,也有对它建立索引的必要。

    刚才提到只有某些时候的LIKE才需建立索引。因为在以通配符%和_开头作查询时,MySQL不会使用索引。例如下句会使用索引:

    复制代码代码如下:

    SELECT * FROM mytable WHERE username like'admin%'

    而下句就不会使用:
    复制代码代码如下:
    SELECT * FROM mytable WHEREt Name like'%admin'

    因此,在使用LIKE时应注意以上的区别。

    g.索引的不足之处

    上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:

    1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

    2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。

    索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。

    h.使用索引的注意事项

    如果我们的表中有复合索引(索引作用在多列上),此时我们 要注意:
    1)对于创建的多列索引,只要查询条件使用了最左边的列,索引一般都会使用
    2)对于使用like的查询,查询如果是“%aaa”,不会使用到索引
    “aaa%”会使用到索引,即like查询是,关键字最前面不能使用%或者_这样的字符,如果一定前面有变化的值,则考虑使用全文索引
    3)如果条件中有or,即使其中有条件用到了索引,换言之,就是需要使用的所有条件都需要使用到索引,避免使用到or关键
    4)如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。也就是如果列为字符串类型,就一定要用单引号包起来


    4.sql语句的小技巧

    1)在使用group by 分组查询时,默认分组之后,还会排序,可能会降低速度
    解决方法:在group by后面增加 order by null 就可以防止排序

    2)有些情况下,尽量可以使用连接来替代子查询,因为使用Mysql不需要在内存中创建临时表。

    如何选择mysql的存储引擎
    MyISAM 存储 如果表对事务要求不高,同时是以查询和添加为准的,我们考虑用MyISAM存储引擎,比如用发帖表和回复表
    innodb 存储 对事物的要求高,保存的数据都是重要的数据,我们用innodb,比如订单表,账户表
    memory 存储 比如我们数据变化频繁,不需要入库,同时又频繁查询和修改,我们考虑使用memory,速度极快,但是是在内存中,不会存到磁盘中去

    MyISAM 和 innodb 引擎的区别
    a.MyISAM的插入速度比innodb插入输入要快
    b.MyISAM是不支持事务回滚的,innodb是支持的
    c.MyISAM是支持全文索引的,innodb不支持
    d.MyISAM是表级锁,innodb是行级锁
    f.MyISAM是不支持外键的,innodb是支持外键的

    如果数据库的存储引擎是MyISAM,请一定记住定时进行碎片整理


    5.数据库定时备份

    1)手动备份数据库(表)的方法
    mysqldump -u root -proot 数据库 > 备份的文件的路径

    如果你希望备份的是数据库的某几张表
    cmd 控制台
    mysqldump -u root -proot 数据库[表名1 表名2] > 备份的文件的路径

    如何使用备份文件恢复我们的数据
    mysql控制台
    source 备份的文件的路径

    2)我们使用的一个定时器自动完成
    把备份数据库的指令,写入到bat处理文件中,然后通过任务管理器去定时的调动bat文件


    6.表的分割技术

    1)水平分割

    水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。

    水平拆分的一些技巧

    1. 拆分原则
    通常情况下,我们使用取模的方式来进行表的拆分;比如一张有400W的用户表users,为提高其查询效率我们把其分成4张表users1,users2,users3,users4
    通过用ID取模的方法把数据分散到四张表内Id%4+1 = [1,2,3,4]
    然后查询,更新,删除也是通过取模的方法来查询

    $_GET['id'] = 17,
    17%4 + 1 = 2,  
    $tableName = 'users'.'2'
    Select * from users2 where id = 17;
    

    在insert时还需要一张临时表uid_temp来提供自增的ID,该表的唯一用处就是提供自增的ID;

    insert into uid_temp values(null);
    

    得到自增的ID后,又通过取模法进行分表插入;
    注意,进行水平拆分后的表,字段的列和类型和原表应该是相同的,但是要记得去掉auto_increment自增长

    另外
    部分业务逻辑也可以通过地区,年份等字段来进行归档拆分;
    进行拆分后的表,只能满足部分查询的高效查询需求,这时我们就要在产品策划上,从界面上约束用户查询行为。比如我们是按年来进行归档拆分的,这个时候在页面设计上就约束用户必须要先选择年,然后才能进行查询;
    在做分析或者统计时,由于是自己人的需求,多点等待其实是没关系的,并且并发很低,这个时候可以用union把所有表都组合成一张视图来进行查询,然后再进行查询;

    Create view users as select from users1 union select from users2 union.........

    2)垂直分割

    垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表

    通常我们按以下原则进行垂直拆分:

    1. 把不常用的字段单独放在一张表;
    2. 把text,blob等大字段拆分出来放在附表中;
    3. 经常组合查询的列放在一张表中;

    垂直拆分更多时候就应该在数据表设计之初就执行的步骤,然后查询的时候用join关键起来即可;


    7.表的字段保小不保大
    tinyint < smallint < mediumint < int < bigint


    8.通过配置my.ini 来优化mysql

    #########################################################
        [client]
        port=3306
        default-character-set=utf8
    #regin
        [mysqld]
        port=3306 
        character_set_server=utf8
        basedir="E:\wamp\Mysql"
        #解压目录
        datadir="E:\wamp\Mysql\data"
        #解压目录下data目录
        sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
        [WinMySQLAdmin]
        E:\wamp\Mysql\bin\mysqld.exe
    #########################################################
    [优化数据库】2017-05-22 09:45]

    max_connections=1024
    #【max_connections=1024】允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到 too many connections 错误。 默认数值是100,我把它改为1024 。
      
    record_buffer =16M 
    #每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。默认数值是131072(128k),我把它改为16773120 (16m)


    skip-locking
    #避免MySQL的外部锁定,减少出错几率增强稳定性。

    skip-name-resolve 
    #禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!

    back_log = 384 
    #back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。 如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。 

    interactive_timeout =7200
    #服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 client_interactive 选项的客户。 默认数值是28800,我把它改为7200。

    key_buffer_size = 512M 
    #key_buffer_size指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。对于内存在4GB左右的服务器该参数可设置为256M或384M。注意:该参数值设置的过大反而会是服务器整体效率降低

    max_allowed_packet = 4M
    #MySQL根据配置文件会限制Server接受的数据包大小。有时候大的插入和更新会受 max_allowed_packet 参数限制,导致写入或者更新失败。

    thread_stack = 256K
    #每个连接被创建的时候,mysql分配给它的内存.这个值一般认为默认就可以应用于大部分场景了,除非必要非则不要动它.

    table_cache = 512K 
    #table_cache指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现 open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables'获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。

    sort_buffer_size = 6M
    #查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占,如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M。 

    read_buffer_size = 4M 
    #读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。 

    join_buffer_size = 8M 
    #联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。

    myisam_sort_buffer_size = 64M 
    #MyISAM表发生变化时重新排序所需的缓冲


    thread_cache_size = 64 
    #可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。

    query_cache_size = 64M 
    #指定MySQL查询缓冲区的大小

    tmp_table_size = 256M 
    #通过设置tmp_table_size选项来增加一张临时表的大小

    max_connect_errors = 10000000
    #对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行:FLUSH HOST;。

    wait_timeout = 10
    #指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。

    thread_concurrency = 8 
    #该参数取值为服务器逻辑CPU数量*2,在本例中,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4*2=8 

    skip-networking 
    #开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接!

    innodb_additional_mem_pool_size=4M 
    #innodb_additional_mem_pool_size 是 InnoDB 用来保存数据字典信息和其他内部数据结构的内存池的大小,单位是 byte,参数默认值为8M。数据库中的表数量越多,参数值应该越大,如果 InnoDB 用完了内存池中的内存,就会从操作系统中分配内存,同时在 error log 中打入报警信息。

    innodb_flush_log_at_trx_commit=1 
    #设置为0就是等到innodb_log_buffer_size列队满后再统一储存,默认为1 

    innodb_log_buffer_size=2M 
    #默认为1M 

    innodb_thread_concurrency=8 
    #你的服务器CPU有几个就设置为几,建议用默认一般为8 

    key_buffer_size=256M 
    #默认为218,调到128最佳 

    tmp_table_size=64M 
    #默认为16M,调到64-256最挂 

    read_buffer_size=4M 
    #默认为64K 

    read_rnd_buffer_size=16M 
    #默认为256K 


    8.读写分离

    mysql的读写分离的基本原理是:让master(主数据库)来响应事务性操作,让slave(从数据库)来响应select非事务性操作,然后再采用主从复制来把master上的事务性操作同步到slave数据库中。



    主从复制只要还是使用log_bin日志来实现主从复制,也可做增量备份


    显示binlog二进制日志的柱表,一般都是position 106开始的。可以使用mysql的mysqlbinlog命令查看

    报错的原因是my.cnf中配置了default-character-ser=utf8,可以使用参数--no-defaluts参数来解决



    从中可以看到,所有的对表的操作都会记录下来。

    从中可以看到,所有的对表的操作都会记录下来。


    首先我们先进行一次数据库备份,在备份的时候加上参数-F表示备份后产生一个新的bin-log日志来记录备份后的操作


    参数中-l表示加读锁,等备份完成后自动解锁 

    然后进行一些mysql的操作例如表中插入数据都会记录到bin-log日志中,例如误删除了表等。


    我们需要恢复之前备份的数据,然后数据库备份后数据只能通过bin-log日志来恢复这些操作。


    这里的-v参数会记录恢复的详细信息,-f表示当遇到错误时,可以跳过去,继续执行下面的语句。

    数据库恢复后,备份数据后的操作不能恢复,这就需要bin-log日志恢复了

    执行语句 mysqlbinlog --no-defaults mysql.bin.000003 | mysql -uroot -p 密码

    如果从bin-log日志中恢复误操作的语句,可以使用设置恢复position的位置区间来精确定位 --start-position="459" --stop-position="561",也可根据时间点来恢复

    可通过查看binlog日志中内容来确定要恢复的position区间



    《MySQL Proxy learns R/W Splitting》中详细的介绍了这种技巧以及连接池问题:

      为了实现读写分离我们需要连接池。我们仅在已打开了到一个后端的一条经过认证的连接的情况下,才切换到该后端。MySQL协议首先进行握手。当进入到查询/返回结果的阶段再认证新连接就太晚了。我们必须保证拥有足够的打开的连接才能保持运作正常。
    实现读写分离的LUA脚本: 
      -- 读写分离 
      -- 
      -- 发送所有的非事务性Select到一个从数据库 

    [html]  view plain  copy
    1. if is_in_transaction == 0 and   
    2.   packet:byte() == proxy.COM_QUERY and   
    3.   packet:sub(2, 7) == "SELECT" then   
    4.   local max_conns = -1   
    5.   local max_conns_ndx = 0   
    6.   for i = 1, #proxy.servers do   
    7.   local s = proxy.servers[i]   
    8.   -- 需要选择一个拥有空闲连接的从数据库   
    9.   if s.type == proxy.BACKEND_TYPE_RO and   
    10.   s.idling_connections > 0 then   
    11.   if max_conns == -1 or   
    12.   s.connected_clients < max_conns then   
    13.   max_conns = s.connected_clients   
    14.   max_conns_ndx = i   
    15.   end   
    16.   end   
    17.   end   
    18.   -- 至此,我们找到了一个拥有空闲连接的从数据库   
    19.   if max_conns_ndx > 0 then   
    20.   proxy.connection.backend_ndx = max_conns_ndx   
    21.   end   
    22.   else   
    23.   -- 发送到主数据库   
    24.   end   
    25.   return proxy.PROXY_SEND_QUERY   
    注释:此技巧还可以用来实现其他的数据分布策略,例如分片(Sharding)。


    9.mysql的增量备份


    增量备份的原理
    mysql数据库会以二进制的形式,把用户对mysql数据的操作,记录到文件中。当用户希望恢复的时候可以使用备份文件进行恢复。

    1)增量备份会记录dml语句,创建表的语句,创建数据库,不会记录select语句
    2)他会记录(a.操作语句本身,b.操作的时间,c.操作的位置)

    实际案例,如何进行备份和恢复

    步骤
    1)配置my.ini文件或者my.cnf,启用二进制备份(5.0不支持) (log-bin=d:/binlog/mylog)

    2)可以使用mysqlbinlog程序来查看备份文件

    3)当我们进行操作的时候(除了select)

    4)恢复操作

    5)如何在工作中将全备份和增量备份配合使用,方案:每周一做一个全备份,然后启用增量备份把过期时间设为大于等于7,如果出现数据库崩溃,那么久可以通过时间或者位置恢复,(你需要去看增量备份日志)


    展开全文
  • PHP 经典

    2021-10-17 10:33:11
    外键约束主要用来维护两个表之间数据的一致性。简言之,表的外键就是另一表的主键,外键将两表联系起来。一般情况下,要删除一张表中的主键必须首先要确保其它表中的没有相同外键(即该表中的主键没有一个外键和它相...
  • Mysql优化思路

    2021-02-23 15:48:50
    支持事务,行级锁定,外键约束。事务安全型存储引擎。更加注重数据的完整性和安全性。 (1)存储格式 数据,索引集中存储,存储于同一个表空间文件中。 数据:记录行。索引:一种检索机制,也需要一定的空间,就相当...
  • MySQL相关优化

    2020-12-22 16:46:39
    支持事务,行级锁定,外键约束。事务安全型存储引擎。更加注重数据的完整性和安全性。 (1)存储格式 数据,索引集中存储,存储于同一个表空间文件中。 数据:记录行。索引:一种检索机制,也需要一定的空间,就相当...
  • Mysql 优化技巧

    2020-12-14 17:53:53
    支持事务,行级锁定,外键约束。事务安全型存储引擎。更加注重数据的完整性和安全性。 (1)存储格式 数据,索引集中存储,存储于同一个表空间文件中。 数据:记录行。索引:一种检索机制,也需要一定的空间,就相当...
  • MySQL优化十大技巧

    2020-11-18 08:12:43
    支持事务,行级锁定,外键约束。事务安全型存储引擎。更加注重数据的完整性和安全性。 (1)存储格式 数据,索引集中存储,存储于同一个表空间文件中。 数据:记录行。索引:一种检索机制,也需要一定的空间,就相当...
  • 3)缺点: (1)由于Nosql约束少,所以也不能够像sql那样提供where字段属性的查询。 (2)适合存储较为简单的数据,不能够持久化数据,无事务处理。 关系型VS非关系型 1)存储上 Sql通常以数据库表的形式存储,例如...
  • MySQL数据库优化技巧

    2020-07-04 23:03:30
    支持事务,行级锁定,外键约束。事务安全型存储引擎。更加注重数据的完整性和安全性。 (1)存储格式 数据,索引集中存储,存储于同一个表空间文件中。 数据:记录行。索引:一种检索机制,也需要一定的空间,就相当...
  • mysql 优化详细解读

    2020-06-04 23:23:29
    支持事务,行级锁定,外键约束。事务安全型存储引擎。更加注重数据的完整性和安全性。 (1)存储格式 数据,索引集中存储,存储于同一个表空间文件中。 数据:记录行。 索引:一种检索机制,也需要一定的空间,就...
  • Mysql优化策略

    2020-04-24 11:47:54
    支持事务,行级锁定,外键约束。事务安全型存储引擎。更加注重数据的完整性和安全性。 (1)存储格式 数据,索引集中存储,存储于同一个表空间文件中。 数据:记录行。索引:一种检索机制,也需要一定的空间,就相当...
  • MySQL优化技巧

    2020-04-22 23:37:28
    支持事务,行级锁定,外键约束。事务安全型存储引擎。更加注重数据的完整性和安全性。 (1)存储格式 数据,索引集中存储,存储于同一个表空间文件中。 数据:记录行。索引:一种检索机制,也需要一定的空间,就相当...
  • Mysql优化技巧

    2020-03-31 17:42:37
    支持事务,行级锁定,外键约束。事务安全型存储引擎。更加注重数据的完整性和安全性。 (1)存储格式 数据,索引集中存储,存储于同一个表空间文件中。 数据:记录行。索引:一种检索机制,也需要一定的空间,就相当...
  • PHP-待续...

    2020-04-08 18:17:20
    然后在进去,找到conf目录,在这个目录下有文件httpd.conf,打开 在httpd.conf文件中第178行有: DocumentRoot "D:/SQLUI/wamp/www/",把这里面的路径修改自己代码示例的路径,还有205行这里面的路径保持一样,保存然后重启...
  • PHP试题附答案

    千次阅读 2020-02-14 15:22:21
    定义: 主键--唯一标识一条记录,不能有重复的,不允许为空 外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值 索引--该字段没有重复值,但可以有一个空值 作用: 主键--用来保证数据完整性 外键--用来...
  • PHP面试题大全

    千次阅读 2019-12-20 09:54:40
    系统限制,只显示了2902行,请下载完整版: https://download.csdn.net/download/qq285744011/12042373 问题:请用最简单的语言告诉我PHP是什么? ...回答:MVC由Model(模型), View(视图...
  • 基于php教师档案管理系统毕业设计

    千次阅读 2019-04-13 23:45:39
    Wamp Server并不仅仅是一个软件包,它会在工具栏中安装一个界面,帮助你启动、监控、关闭各项服务。使用Wamp Server的一大优势在于:你再也无需亲自修改配置文件了。同时,它还能创建一个目录,所有文件都将储存在这...
  • web学习笔记

    千次阅读 2018-07-27 20:36:05
    常用属性............................................................................................ 1 Html基础..................................................................................... 3 ...
  • PHP面试题收集整理

    2018-09-30 09:54:10
    (3) 启用浏览器缓存和文件压缩 (4) CDN加速 (5) 建立独立的图片服务器(减少I/O) 3、服务端优化 (1) 页面静态化 (2) 并发处理 (3) 队列处理 4、数据库优化 (1) 数据库缓存 (2) 分库分表,分区 (3)...
  • PHP面试题(一)

    万次阅读 多人点赞 2018-03-24 11:56:54
    ... deque,全名double-ended queue,是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双向队列(双端队列)就像是一 个队列,但是你可以在任何一端添加或...
  • 一....二....echo() 函数输出一个或多个字符串他不是一个函数而是语言结构 print() 函数输出一个字符串他不是一个函数而是语言结构 print_r() 可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示...
  • MySQL优化详解

    2017-03-14 19:57:00
    事务、外键约束 : 都是为了维护数据的完整性。 并发性处理: innodb擅长处理并发的。因为它使用了行级锁定,只该行锁了,其它行没有锁。 行级锁定:row-level locking,实现了行级锁定,在一定情况下,可以...
  • wamp中,mysql使用的精简模式,不是使用严格模式来约束数据,但是独立安装的mysql使用的严格模式。 区别 1. 错误处理方式不一样:精简模式下,如果出现错误,系统会尝试去减少错误代价(数据太长进行截取),在...

空空如也

空空如也

1 2
收藏数 40
精华内容 16
关键字:

wamp启用外键约束