-
MySQL支持多种类型,大致可以分为四类:数值型、浮点型、日期/时间和字符串(字符)类型。1、数值类型 MySQL支持所有标准SQL数值数据类型。 这些数值类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。 关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。 作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围:2、 浮点型比如,我们发的工资,一般都带有小数。3、日期和时间类型 表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。 每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。 TIMESTAMP类型有专有的自动更新特性,将在后面描述。 在生产里,日期时间型,往往用的比较少,而是用数字类型来取代日期类型!4 字符串类型 字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。 CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。 BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。 有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。 ENUM是枚举类型 SET是集合类型不同于ENUM类型,它是一个排列组合。假如有abc,它可以选择a或b或c,也有选择是ab,ac,bc,也可以选择abc。最后总结 这些数据类型可以用于数据表或存储过程或以后的函数中,也就是说只要用到数据类型的时候,可以从我们刚讲到的数值型、浮点型、日期/时间和字符串(字符)类型中任意选择。
-
命令行连接MySqlwin+r : mysql -u root -p -> 输入密码 -> 进入数据库远程连接数据库win+r:mysql -h 远程数据库IP -u user_name -p passwordexit -> 退出mysql的初始化,生成date文件夹并初始化密码通过CMD进入MySQL安装路径的bin 目录下:mysqld --initialize 或 mysqld --initialize-insecure随机密码文件是xxx.err 的文件,xxx还会有一个pid 文件,作用待究在xxx.err文件中找到[Note] A temporary password is generated for root@localhost:,“:”后面就是初始化得到的密码用户管理SHOW GRANTS FOR user_name(@'localhost'); SELECT USER,Db,HOST,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv FROM mysql.db;/*自己写一个取某个表的各字段名称的函数.参数:@prefix前缀 @tablename 表名.返回:该表的所有字段的字符串.*/CREATE FUNCTION [dbo].[dev_fns_GetColStr] (@prefix varchar(20),@tablename varchar(200)) RETURNS varchar(1000) AS BEGIN declare @str varchar(1000) select @str='' select @str=@str+@prefix+[name]+',' from syscolumns where [id]= object_id(@tablename) order by colorder if len(@str)>0 select @str=left(@str,len(@str)-1) return @str END用户名更改rename user 'aaa'@'%' to 'bbb'@'%';修改my.cnf,在mysqld配置节点添加skip-grant-tables配置skip-grant-tables重启SQL服务service mysqld restart修改密码update user set authentication_string=password('123456') where user='root';(5.7版本之后)创建用户并设置权限格式:grant 权限(具体可控制权限见下表) on DataBase_Name(*表示所有数据库).Table_Name(*表示所有数据库) to 用户名@登录主机(%表示任何机器) identified by '密码'(可以为空,表示此用户没有密码) with grant option(允许用户将自己的权限授权给其它用户);增加一个用户user1密码为password1,让其可以在本机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令: grant select,insert,update,delete on *.* to user1@localhost Identified by "password1"; //如果希望该用户能够在任何机器上登陆mysql,则将localhost改为"%"。 //如果你不想user1有密码,可以再打一个命令将密码去掉。 grant select,insert,update,delete on mydb.* to user1@localhost identified by ""; grant all privileges on user_name.* to sunxiao@localhost identified by 'password';用户权限管理主要作用: 1. 可以限制用户访问哪些库、哪些表 2. 可以限制用户对哪些表执行SELECT、CREATE、DELETE、INSERT、ALTER等操作 3. 可以限制用户登录的IP或域名 4. 可以限制用户自己的权限是否可以授权给别的用户修改密码:首先在DOS 下进入mysql安装路径的bin目录下,然后键入以下命令:mysqladmin -uroot -p123 password 456;创建用户:CREATE USER 'user_name'@'host' IDENTIFIED BY 'password';查看用户:SELECT user,host,authentication_string FROM mysql.user;修改权限:GRANT privileges(权限) ON database_name.table_name TO 'user_name'@'host';撤销用户权限:REVOKE privilege(可以撤销部分权限) ON DB_name.T_name FROM 'user_name'@'host';查看用户权限:在mysql.db中记录所有用户的权限删除用户:DROP USER 'user_name'@'host';
-
背景描述查询缓存(Query Cache,简称QC),存储SELECT语句及其产生的数据结果。适用场景用于频繁提交同一个语句,并且该表数据变化不是很频繁的场景,例如一些静态页面,或者页面中的某块不经常发生变化的信息。由于查询缓存需要缓存最新数据结果,因此表数据发生任何变化(insert、update、delete或其他可能产生数据变化的操作),都会导致查询缓存被刷新。因而,对于一个更新频率非常低而只读查询频率非常高的场景下,打开查询缓存还是比较有优势的。不适用场景查询缓存严格要求2次SQL请求要完全一样,包括SQL语句,连接的数据库、协议版本、字符集等因素都会影响。下面为查询缓存不适用的几个场景:子查询;过程、函数、触发器、event中调用的SQL,或者引用到这些结果的;查询中涉及一些特殊函数时,例如:BENCHMARK()、CURDATE()、CURRENT_TIME()、CURRENT_TIMESTAMP()、NOW()、SLEEP()、CONNECTION_ID()、CURRENT_DATE()、CURRENT_USER()、PASSWORD()、RAND()、UUID()、ENCRYPT()、LAST_INSERT_ID()等等;查询涉及到mysql,information_schema或performance_schema。类似SELECT…LOCK IN SHARE MODE、SELECT…FOR UPDATE、SELECT..INTO OUTFILE/DUMPFILE、SELECT * FROM ... WHERE autoincrement_col IS NULL的查询;SELECT执行计划用到临时表;未引用任何表的查询,例如SELECT 1+2;查询产生了告警(warnings);SELECT语句中存在SQL_NO_CACHE关键字;涉及到分区表。可见,使用查询的缓存的限制非常多。当使用场景中以只读为主,很少有更新的情况时,再考虑开启查询缓存。开启查询缓存设置选项query_cache_type = 1 ,同时设置query_cache_size = 67108864;注:query_cache_size的值设置在100MB以内即可。在MySQL里查询缓存是由一个全局锁在控制,每次更新查询缓存的内存块都需要进行锁定。关闭查询缓存设置选项query_cache_type = 0,同时设置query_cache_size = 0。
-
场景描述用户新建实例,用代码连接该数据库时出现报错:Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_versionMySQL原有版本为5.7.23,升级到5.7.25版本后,导致现有配置无法正常连接到MySQL-server,抓包结果如下图1:可以看出,客户端进行TLS握手时向服务端发送的TLS版本号是1.0,并提供了15个支持的密码套件。图1 连接失败抓包结果故障分析从MySQL-server的回复中如 图2可以看到,服务器拒绝了客户端的链接,原因是MySQL 5.7.25升级了openssl版本(1.1.1a),导致拒绝了不安全的TLS版本和密码套件。图2 MySQL-server的回复解决方案升级您的JDK客户端到 JDK 8或以上版本,则默认支持的TLS为1.2版本,如 图3,可以正常连接的客户端支持TLS1.2,并支持30个密码套件。图3 正常连接抓包结果
-
1、下载地址 wget http://downloads.mysql.com/archives/get/file/mysql-5.6.27-linux-glibc2.5-x86_64.tar.gz 2、安装说明 http://dev.mysql.com/doc/refman/5.6/en/binary-installation.html3、安装步骤:shell> groupadd mysql shell> shell> useradd -r -g mysql -s /bin/false mysql shell> cd /usr/local shell> tar zxvf /path/to/mysql-VERSION-OS .tar.gz shell> ln -s full-path-to-mysql-VERSION-OS mysql shell> cd mysql shell> chown -R mysql . shell> chgrp -R mysql . shell> scripts/mysql_install_db --user=mysql shell> chown -R root . shell> chown -R mysql data shell> bin/mysqld_safe --user=mysql & # Next command is optional shell> cp support-files/mysql.server /etc/init.d/mysql.server 4、安装完成后,设置root密码(安装很多遍,一直没仔细看过这个说明)PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: ./bin/mysqladmin -u root password 'new-password' ./bin/mysqladmin -u root -h localhost.localdomain password 'new-password' Alternatively you can run: ./bin/mysql_secure_installation which will also give you the option of removing the test databases and anonymous user created by default. This is strongly recommended for production servers. See the manual for more instructions. You can start the MySQL daemon with: cd . ; ./bin/mysqld_safe & You can test the MySQL daemon with mysql-test-run.pl cd mysql-test ; perl mysql-test-run.pl提示mysql命令不存在:ln -s /usr/local/mysql/bin/mysql /usr/bin 安装后,用/usr/local/mysql/bin/mysql -u root -p 进入报错 /usr/local/mysql/bin/mysql: unknown variable 'datadir=/data1/mysql/var/' 这里需要修改my.cnf 配置问题 :[client] #password = your_password port = 3306 socket = /tmp/mysql.sock datadir = /data1/mysql/var/ #把这里已到下方mysqld部分里 [mysqld] port = 3306 socket = /tmp/mysql.sock datadir = /data1/mysql/var/ #加这里
-
Oracle和Mysql都是数据库但是有些地方还是不一样,我在这里记录一下。 本质区别:Oracle数据库是一个对象关系数据库管理系统(收费)MySQL是一个开源的关系数据库管理系统(免费) 数据库的安全性:mysql使用三个参数来验证用户,即用户名,密码和位置Oracle使用了更多的安全功能,如用户名,密码,配置文件,本地身份验证,外部身份验证,高级安全增强功能等 权限 MySQL的权限系统是通过继承形成的分层结构。权限授于高层时,其他低层隐式继承被授于的权限,当然低层也可改写这些权限。 按授权范围不同,MySQL有以下种授权方式: 1、全局; 2、基于每个主机; 3、基于表; 4、基于表列。 每一级在数据库中都有一个授权表。当进行权限检查时,MySQL从高到低检查每一张表,低范围授权优先于高范围授权。 与Oracle不同,MySQL没有角色的概念。也就是说,如果对一组用户授于同样的权限,需要对每一个用户分别授权。 模式迁移 模式包含表、视图、索引、用户、约束、存储过程、触发器和其他数据库相关的概念。多数关系型数据库都有相似的概念。 本节包含以下内容: 1、模式对象的相似性; 2、模式对象的名称; 3、表设计时的关注点; 4、多数据库整合; 5、MySQL模式整合的关注点。 模式对象的相似性 就模式对象,Oracle和MySQL存储诸多的相似,但也有一些不同。 模式对象OracleMysqlAFTER triggertriggerBEFORE triggertriggerCheck constraintCheck constraintColumn defaultColumn defaultDatabaseDatabaseForeign keyForeign keyIndexIndexPackageN/APL/SQL functionRoutinePrimary keyPrimary keyRoleN/ASchemaSchemaSequenceAUTO_INCREMENT for a columnSnapshotN/ASynonymN/ATableTableTemporary tableTemporary tableTrigger for each rowTrigger for each rowUnique keyUnique key 模式对象的名称 Oracle是大小写不敏感的,并且模式对象是以在写时行存储。在Oracle的世界中,列、索引、存储过程、触发器以及列别名都是大小写不敏感,并且在所有 的平台都是如此。MySQL是大小写敏感的,如数据库相对的存储路径、表对应的文件都是如此 当把关键字用引号引起来时,Oracle和MySQL都允许把这些关键字用于模式对象。但MySQL对于一些关键字,不加引号也行。 表设计的关注点 本节主要讨论当把MySQL转为Oracle时需要注意的地方。主要包含以下两点: 1、字符数据的类型; 2、列默认值。 3.2.3.1 字符数据类型 MySQL和Oracle在字符型数据保存和读取上存在一些不同。MySQL的字符类型,如CHAR和VARCHAR的长度小于65535字节。 Oracle支持4种字体类型:CHAR、NCHAR、NVARCHAR2和VARCHAR2。CHAR和NCHAR的最大长度为2000字节, NVARCHAR2和VARCHAR2最大长度为4000字节。 MySQL和Oracle在字符型数据保存和读取上存在一些不同。MySQL的字符类型,如CHAR和VARCHAR的长度小于65535字节。Oracle支持4种字体类型:C HAR、NCHAR、NVARCHAR2和VARCHAR2。CHAR和NCHAR的最大长度为2000字节,NVARCHAR2和VARCHAR2最大长度为4000字节。 3.2.3.2 列默认值 MySQL会处理列默认值,不允许他为空,这点和Oracle不同。在Oracle中如果向表插入数据,需要对有所有不允许为NULL列的值。 多数据库迁移 如果多个MySQL数据库位于同一个数据库服务上,支持迁移。 数据存储概念 MySQL的数据库对应于服务器上数据目录内的了目录,这一数据存储方式与多数据数据库不同,也包括Oracle。数据库中的表对应一个或者多个数据库目录下的文件,并取表存储时的存储引擎。 一个Oracle数据库包含一个或者多个表空间。表空间对应数据在磁盘上的物理存储。表空间是从一个或者多个数据文件开始构建的。数据文件是文件系统中的文件或者原始存储的一块空间。 一些语法上的区别: 主键:mysql一般使用自动增长类型,在创建表的时候指定表的主键为auto increment,主键就会自动增长。Oracle中没有自动增长,主键一般使用序列,插值时依次赋值即可。 引号问题: Oracle不使用双引号,会报错mysql则对引号没有限制 分页查询:mysql分页查询使用关键字limit来实现Oracle没有实现分页查询的关键字,实现起来较复杂,在每个结果集中只有一个rownum字段标明它的位置,并且只能用rownum<=某个数,不能用rownum>=某个数,因为ROWNUM是伪列,在使用时所以需要为ROWNUM取一个别名,变成逻辑列,然后来操作 数据类型:mysql中的整型:int(),字符串类型:varchar()Oracle中的整形:number(),字符串类型:varchar2()
-
场景描述需要使用修改user表方式修改mysql密码,但找不到修改路径。解决方案步骤 1 修改mysql的配置文件,修改为跳过密码验证:vim /etc/my.cnf在[mysqld]下添加skip-grant-tables。步骤 2 重启mysql服务。service mysqldrestart步骤3 在“mysql –uroot –p”处回车即可进入数据库。步骤 4 输入命令“desc mysql.user ”。即可看到mysql5.7版本没有password列,显示为authentication_string。步骤5 执行命令:update mysql.user setauthentication_string=password('新密码') where user='root' andHost = 'localhost'即可设置为新密码。步骤6 退出,将skip-grant-tables字段删除或注释即可。资料来自华为云
-
场景描述客户远程连接(包括telnet3306端口)MySQL时报错:Host * is not allowed to connectto this MySQL server。问题分析一般是由于帐号不允许远程登录,只能在localhost登录造成。解决方案目前针对这种情况,我们提供了两种解决方案:方案一:改表法 可能该帐号不允许远程登录,此时,需在安装localhost 的电脑登录mysql,并更改 “mysql 数据库 > user表 > host项 > localhost”为"%"。执行如下命令:mysql -u root –ppasswd use mysql; mysql>update user set host = '%' whereuser = 'root'; mysql>select host, user from user; mysql>flush privileges;方案二:授权法l 若想实现myuser使用mypassword从任何主机连接到mysql服务器,在本地登录数据库后执行如下命令:GRANT ALL PRIVILEGES ON *.* TO'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;FLUSH PRIVILEGES;l 若想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作为密码,执行如下命令:GRANT ALL PRIVILEGES ON *.* TO'myuser'@'192.168.1.6' IDENTIFIEDBY 'mypassword' WITH GRANT OPTION;FLUSH PRIVILEGES;在安装mysql的机器上运行如下命令:mysql -h localhost -u root//登录mysql>GRANT ALL PRIVILEGES ON *.* TO'root'@'%' WITHGRANT OPTION //赋予任何主机访问数据的权限mysql>FLUSH PRIVILEGES;//修改生效mysql>QUIT //退出MySQL服务器这样就可以实现在其它任何的主机上以root身份登录。目前我方云主机,在数据库开启允许远程后,如果仍无法连接可尝试清空防火墙以及开放安全组指定端口进行处理。
-
1.索引是什么 索引是一类数据结构,凭借数据结构的特性,使得在数据库中使用索引能够减少数据检索所需要的时间。 常见的索引有两种:聚集(簇)索引和非聚集(簇)索引。 聚集索引 聚集索引又称为主键索引,顾名思义当创建表时指定了主键字段,主键索引是默认自动创建的。聚集索引的特定是不能为空,且值具有唯一性。 非聚集索引 非聚集索引主要有三种,普通索引、唯一索引(唯一性)、full text索引(仅在MyISAM引擎中支持,解决大文本like效率低下)。2.索引的底层数据结构有序数组数组的值是顺序排列的,等值查询或者范围查询的速度特别快,由于插入数据需要移动数组里的元素,所以插入特别慢。单链表单链表使用指针进行数据关联,插入数据时只需要从链表尾部插入即可,速度特别快,时间复杂度达到O(1)级别。检索数据需要进行全链表检索,速度特别慢,时间复杂度达到O(n)级别。树二叉查找树最普通的二叉搜索树,左子树的值小于父节点,右子树的值大于父节点。平衡二叉树(AVL树)动态的二叉搜索树,左右子树的深度差绝对值不超过1。实现方式:插入过程中,如树条件不满足,平衡二叉树动态的进行左旋或右旋。缺点:一个子树消耗一个页的空间(默认16K),子树最大值为2,数据量大时,一次查询需要发生大量IO读取(假如磁盘是机械,还存在磁盘寻址时间,性能低下)。解决办法:一个子树存放尽量多的节点,减少IO读取次数,平衡二叉树(AVL树) —》 多路平衡查找树(B树)。多路平衡查找树(B树)索引Key的数量(关键字数):N,子树的引用数量(度):N + 1。原因:索引Key是平衡的,如Key数量为2,则存在的取值范围数为3。a<key1 , key1 <= a <= key2 , key2 < a特点:非最下层的叶子节点也可能存放完整的数据,一个子树消耗一个页的空间(默认16K),对比AVL树,大大减少IO读取次数。加强版多路平衡查找树(B+树)索引Key的数量(关键字数):N,子树的引用数量(度):N 。特点;只有最下层的叶子节点才会存放完整的数据,其他叶子节点只有key值和指针引用。最下层的子树之间(存放真实的表的列数据子树)使用了指针进行连接,极大的增强了范围查找的性能。优点:B+树 > B 树,扫库、扫表能力更强,磁盘读写能力更强,排序能力更强,效率更加稳定。3.不同存储引擎中索引的落地方式MyISAM数据和索引以文件的方式分别存储的.MYD(数据文件),.MYI(索引文件)。工作方式:主键索引寻找数据的逻辑和辅助索引一致。优势:使用前缀压缩技术使得索引更小先完全保存索引块中的第一个值,然后将其他值和第一个值进行比较得到相同前缀的字节数和剩余的不同后缀部分,把这部分存储起来即可。索引块中的第一个值是"perform",第二个值是"performance",那么第二个值的前缀压缩后存储的是类似"7,ance"这样的形式。这个技术使得空间的消耗更小,但是也导致了检索的时间需要更多InnoDB数据和索引以文件的方式同时存放在一起,使用.idb作为后缀。InnoDB拥有一个自适应哈希索引的特性,当某些索引使用的非常频繁时,InnoDB会自动在基于B+树上创建一个哈希索引,使得这些热点索引的查找会变得非常之快(对用户是无感的,但是可以手动关闭该功能)。索引在存储引擎层进行实现而不是服务器层。工作方式主键索引:存储索引和数据辅助索引:存储索引和主键值为什么辅助索引存放的是主键值而不是主键的地址呢,当主键值很大的时间,岂不是浪费空间吗?答:因为mysql管理空间的最小单位是页,当存放主键的数据文件的页发送分裂时,主键的地址会发生改变,这时维护辅助索引的主键地址花销太大了,但是主键的值是不会发生改变的。如果创建表的时候,没有指定主键怎么办,辅助索引又要如何工作呢?答:首先会去找列中为 union索引的列,如果没有union key则会使用隐含的rowid作为主键索InnoDB的逻辑存储结构默认每个区的大小为1M,一个区里默认有64页,默认每页的大小为16K。在Normal索引中,可能经常性的存在插入一行数据时,发生页分裂,导致页数据的重组。4.索引的特性和使用原则1.索引的特性1)表的选择性选择性计算公式:不重复的索引值 / 数据表的记录总数 (范围在1/表总数 到 1 之间)。表的选择性越接近1,则查询效率越高,性能是最好的。选择性低的表,建立索引的意义不大。因为InnoDB的B+树是顺序的,如果选择性低,则表示重复检率高,使得很多地方的检索看起来像是链表,几乎等于在链表中检索,约等于全表扫描。2)联合索引最左匹配使用索引时,查询的条件必须根据建立索引的条件顺序去逐一满足,不能够中断,不能够只写后面的索引,这样索引才会生效。假如使用联合索引创建了index(a,b,c),相当于创建了index(a),index(a,b),index(a,b,c),无需再单独创建a或b的索引。但是可以继续创建index(b,c),因为index(b,c)并不属于index(a,b,c)的最左前缀索引。如果查询条件中某个列使用了范围查询,则其后续的索引都无法使用。3)索引覆盖什么是回表使用辅助索引作为条件时,会先去查找辅助索引对应的B+树,并找到对应的主键值,根据主键值去主键索引对应的B+树种找到真正的数据,等于是一次查询,查找了两颗B+树,查找第二颗树的动作就叫做回表。什么是覆盖索引?sql语句查询的结果的字段包含在当前满足where条件的索引里,结果中的数据可以直接在索引树中取得,使得无需回表查询主键索引树。为什么说查询什么数据就写什么字段,杜绝写select * 的原因?答:因为写select * 时,当where是辅助索引时,必须增加一次回表的数据访问,同时也增加了IO访问次数。满足覆盖索引的索引类型Mysql中只有B+Tree所有支持覆盖索引。哈希索引、空间索引、全文索引都不存储索引列的值,也就不支持覆盖索引。4)索引条件下推应用条件:只适用于二级索引(辅助索引)。索引的过滤是在存储引擎层进行的,数据的过滤是在Server层进行的。场景:index(name1,name2) where name1 = ? and name2 like ?如果未开启索引条件下推,则在使用索引查找数据时,只会使用name1作为条件后即回表再过滤name2条件(在Server层过滤)。如果使用索引条件下推,则在使用索引查找数据时,使用name1和name2(使用like默认是不会进行条件过滤的,是索引条件下推起的作用)进行条件过滤后(在存储引擎层)才会回表。优点:减少IO操作2.索引的创建原则在用于where判断order排序和join的( on )字段上创建索引索引的个数不要过多。区分度低的字段,例如性别,不要建索引。频繁更新的值,不要作为主键或者索引。多列联合索引时,将选择性最高的列放到索引最前列。可以使用Count(索引字段)/Count(*),来查看某个字段的选择性高低,选择性高的字段一般放在前面。创建复合索引,而不是修改单列索引。尽可能的做到覆盖索引(select的数据列尽可能都覆盖在索引中),减少查找了辅助索引后,根据主键值查找主键索引树,导致回表,出现二次查找总结:索引虽好,但是表中的索引越多,则插入越慢。增加的新索引会导致insert,update,delete的操作速度会变慢。因为当数据产生了变更的时候,需要去维护对应字段所对应的索引树,树越多,则维护起来就越慢。为什么不建议用无序的值(例如身份证、UUID )作为索引?无序的值作为索引的话,写入的值是随机的,可能出现大量页的分裂,由于大量页分裂,导致页变的支离破碎,最终导致B+树出现大量碎片。如果使用顺序的主键插入,当出现并发插入时,会有两个问题。一:间隙锁竞争 二:自增主键的锁机制3.索引的使用误区独立的列如果查询的列不是独立的,则无法使用索引。eg: select user_id from user where user_id + 1 = 5like条件中前面带%,或者前后都带%,无法使用索引。只有最后带%,可以使用索引索引列上使用函数(sum,count等等)(在输出列数据中使用count貌似能使用到索引)、表达式字符串不加引号,出现隐式转换like条件中前面带%负向查询中可能能用到索引,可能用不到索引4.分析sql语句的索引使用情况在sql语句前面加上关键字:explain
-
目的:通过本地连接华为云数据库MySQL环境准备:1.Navicat本地数据库管理软件 2.购买RDS for MYSQL 并创建实例 进入自己买的数据库的管理控制台界面,滑到"连接信息"处开启远程连接,这一步需要验证,验证一下就行开启远程连接之后,后面会自动生成一个ip地址设置远程连接白名单,如果是使用公网的话,建议使用0.0.0.0/0,私网的话就使用自己本地ip之后确定,然后就可以在自己本地通过Navicat连接到这个云数据库了只有两点需要注意:在管理控制台中允许远程连接和设置白名单;连接数据库使用的是主机ip号是允许远程连接后自动生成的ip地址,而且每次关闭开启后生成的ip都不相同,需要注意;使用上面的以168开头的内网地址ip,我们本地远程连接会报2003错误
-
在程序员这个群体中,多数人是从事应用开发,在应用开发中一定会跟数据打交道。很多程序员入门学习就是Mysql数据库,它不仅仅是找工作面试最常问的,也是干私活必备的数据库。当然在如今数字基建的背景下,云数据库应运而生,这是对开发人员很友好的一个存在,作为开发时不用过多关注数据库怎么搭建维护,只需要以最简单的方式使用好数据库,从而可以专注于应用的开发。那么今天我就分享一下以自建Mysql数据库和云数据库的区别和使用,供学习工作参考使用。【MySQL】MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。开源,免费。 世界上最流行的开源数据库系统,功能足够强大,足以应付web应用。使用C和C++编写,支持包括window,linux 在内的等多种操作系统上运行。支持多线程,充分利用CPU资源。提供TCP/IP、ODBC和JDBC等多种数据库连接途径。【来源百度百科】【裸机linux搭建MySQL数据库】前提:linux机器可以自己用VM创建一个虚拟机,但是我更推荐直接去华为云市场撸一台,毕竟828的福利不能错过。本来我想用现在就直接上手撸命令1.找到mysql数据库yum源wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm2.安装升级软件包rpm -Uvh mysql57-community-release-el7-11.noarch.rpm2.1查看yum源是否生效yum repolist enabled | grep mysql3.yum安装mysql 安装过程中需要下载时间比较长 (这个过程我用了一个多小时)yum install mysql-community-server中间提示选择y4.服务启动service mysqld start 4.1查看mysql服务 service mysqld status5.查看初始密码(5.7默认不允许使用空密码登录)cat /var/log/mysqld.log | grep 'A temporary password' 6.使用初始密码登录mysql注意 u 和p 后面不能加空格,否则报错mysql -uroot -p'临时密码' 登录完成后现在你做什么操作都会有下面的提示You must reset your password using ALTER USER statement before executing this statement (使用数据库前必须重置密码)7.修改初始密码(以下都是在数据库中操作,不是在linux 系统中。以mysql>开头的命令行操作)密码为强密码要求包含大小写字母、数字及特殊字符,长度在6位以上ALTER user 'root'@'localhost' identified by 'Mlscoder@123.';7.1 以后就可以使用新密码登录mysql -uroot -p'Mlscoder@123.'9.开启远程登录 mysql 默认只能本地localhost登录,增加远程登录的权限 (方便使用navicat等工具远程链接)GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Mlscoder@123.' WITH GRANT OPTION;9.1查看当前用户的相关信息select User,Host,authentication_string from user;10.创建数据库create database myuser;使用数据库use myuser;查看当前数据库中的所有表show tables ;11.创建表create table user (id int (10) not null AUTO_INCREMENT comment 'id',name varchar (100) comment '姓名',age int (3) comment '年龄',address varcahr(255) comment '地址',PRIMARY key (id))DEFAULT CHARSET=utf8mb4 comment '用户信息表' ; 11.1 查看表结构 desc user ;12.表中插入数据insert into user (id,name,age,address ) values (1,'张三',20,'上海市浦东新区') ;12.1 查看表数据select * from user ;12.2 不指定id插入数据,在创建表DDL中,AUTO_INCREMENT 表示主键自增。insert into user (name ,age ,address) values ('李四',25,'上海市徐汇区');select * from user;当然很少人会这样用数据库,即便是大佬,也是使用navicat、toad、PL/SQL等等一系列的数据库管理工具,当然一些并不是免费的。整完了自己搞的,我们上手做一个云数据库吧,体验一把什么叫上云,也是拿华为云RDS来演示使用。【华为云数据库RDS是啥】华为云关系型数据库(Relational Database Service,简称RDS)是一种基于云计算平台的即开即用、稳定可靠、弹性伸缩、便捷管理的在线关系型数据库服务。通过华为云关系型数据库服务的管理控制台,用户几乎可以执行所有必需任务而无需编程,简化运营流程,减少日常运维工作量,从而专注于开发应用和业务发展。创建RDS实例后,您可以通过多种方式连接实例,连接后可以进行数据导入导出,以及创建数据库和帐户等操作。行了废话不多说了,动手直接搭建一下。前后从创建到可以使用也就2分钟,比起自己下载来快多了,其实也是依托着镜像容器来处理的,一个数据库实例放在一个容器中,这个在深一点就是高级运维工程师需要做的内容,容器集群的管理。华为云的web在线数据管理页面感觉还是很大气的 然后我也是同样的新建一个user表,在操作mysql的数据库的时候都是执行的DDL或者DML语句,不管是在线管理还是客户端工具,可以协助生成SQL语句,不过像这种创建表的语句还是可以的设置的, 但是复杂的查询语句还是需要自己来写。SQL的中文名叫结构化查询语言(Structured Query Language),不管是mysql、oracle还是sql server 都是用sql来搞。换句话说, sql 跟Java、Python一样,也是一个语言。通过生成的DDL语句,来执行操作,这个也比较简单。但是让我比较中意的功能是SQL诊断和慢查询日志我用之前做的一个项目的demo来演示一下什么叫SQL诊断。从我的本地库中导入云数据库一个数据库,因为是这个开发库,毕竟生产生的数据有些敏感,这里仅仅演示功能使用。目标:用华为云数据库诊断一下我们上面的这个SQL 是否存在性能问题,以方便我们开发有针对性的优化这个问题哦先把数据库结构和数据导入之后进入到刚刚导入的库中,打开SQL 性能诊断,复制上刚刚的sql语句,提交诊断,很快就可以得到诊断结果。 看下图的相关结果:在诊断结果中,有比较详细的优化的建议,简直是神器。除此之外还有一个就是慢查询日志,这个功能在云DBA中,需要开启DAS收集慢日志的功能。不过由于本身没有太多的生产数据,仅仅做下演示了。在日志收集上除了收集慢查询,还可以增加一下热点点击,比如像知道那个功能使用的多,那个查询最频繁,知道用户的用为,反馈到运营上,更有针对的对产品做出优化。【总结】在使用和操作上,云数据库在快速搭建上有着不可比拟的优势,主要是依托于镜像容器的解决方案实现秒级搭建,从设置到使用,前后不过1分钟,极大的减少了开发人员的在数据库上搭建的时间。其次便捷的web操作界面、SQL诊断、慢查询日志等在分析,为企业级别开发也是如虎添翼。同时,减少了自购服务器的繁琐和成本,本身具有的弹性伸缩的特点,保障了日后业务增长可能需要的快速扩容,成为企业用户或者个人开发者的一个不错的选择。
-
使用云数据库MySQL时,如果您的CPU使用率很高或接近100%,会导致数据读写处理缓慢、无法获取连接、出现报错等,从而影响业务正常运行。解决方法一分析慢SQL日志(如果有)以及CPU使用率指标来定位效率低的查询,再优化查询效率低的语句。查看慢SQL日志来确定是否存在运行缓慢的SQL查询以及各个查询的性能特征(如果有),从而定位查询运行缓慢的原因。查询MySQL日志,请参见慢查询日志。查看华为云关系型数据库实例的CPU使用率指标,协助定位问题。请参见通过Cloud Eye监控。创建只读实例专门负责查询。减轻主实例负载,分担数据库压力。多表关联查询时,关联字段要加上索引。尽量避免用select*语句进行全表扫描,可以指定字段或者添加where条件。解决方法二分析当前数据库运行线程来定位效率低的查询,再通过华为云数据管理服务(Data Admin Service,简称DAS)提供的建议优化这些SQL语句来降低实例的CPU使用率以提升系统效率。连接MySQL实例。具体操作请参见《关系型数据库快速入门》,通过内网和公网连接实例的内容。执行以下命令,查看当前执行操作,定位效率低的查询。show full processlist*************************** 1. row *************************** Id: 16193 User: rdsAdmin Host: localhost db: NULL Command: Query Time: 0 State: starting Info: show full processlist Memory_used: 16424 Memory_used_by_query: 8208 CPU_time: 294611 Trx_Executed_Time: 0 logical_page_read: 0 disk_page_read: 0 iops_limit_count: 0 *************************** 2. row *************************** Id: 16246 User: root Host: ******** db: test04_1 Command: Query Time: 36 State: creating table Info: create table test04_1.table_test_7(a int, b varchar(21632)) Memory_used: 151378 Memory_used_by_query: 8208 CPU_time: 128329 Trx_Executed_Time: 0 logical_page_read: 57 disk_page_read: 0 iops_limit_count: 0 *************************** 3. row *************************** Id: 16247 User: root Host: ******** db: test01_1 Command: Query Time: 36 State: creating table Info: create table test01_1.table_test_7(a int, b varchar(21632)) Memory_used: 151378 Memory_used_by_query: 8208 CPU_time: 127529 Trx_Executed_Time: 0 logical_page_read: 0 disk_page_read: 0 iops_limit_count: 0 *************************** 4. row *************************** Id: 16261 User: root Host: ******** db: test05_1 Command: Query Time: 16 State: creating table Info: create table test05_1.table_test_6(a int, b varchar(21632)) Memory_used: 151378 Memory_used_by_query: 8208 CPU_time: 150650 Trx_Executed_Time: 0 logical_page_read: 0 disk_page_read: 0 iops_limit_count: 0 *************************** 5. row *************************** Id: 16262 User: root Host: ******** db: test_1 Command: Query Time: 14 State: creating table Info: create table test_1.table_test_5838(a int, b varchar(21632)) Memory_used: 151376 Memory_used_by_query: 8208 CPU_time: 179596 Trx_Executed_Time: 0 logical_page_read: 0 disk_page_read: 0 iops_limit_count: 0 *************************** 6. row *************************** Id: 16266 User: root Host: ******** db: test02_1 Command: Query Time: 8 State: creating table Info: create table test02_1.table_test_9(a int, b varchar(21632)) Memory_used: 151378 Memory_used_by_query: 8208 CPU_time: 154582 Trx_Executed_Time: 0 logical_page_read: 0 disk_page_read: 0 iops_limit_count: 0 *************************** 7. row *************************** Id: 16269 User: root Host: ******** db: test03_1 Command: Query Time: 6 State: creating table Info: create table test03_1.table_test_11(a int, b varchar(21632)) Memory_used: 151378 Memory_used_by_query: 8208 CPU_time: 153918 Trx_Executed_Time: 0 logical_page_read: 0 disk_page_read: 0 iops_limit_count: 0 7 rows in set (0.00 sec)得到需要优化的查询后,您可以使用华为云数据管理服务(Data Admin Service,简称DAS),通过SQL诊断查询,您可获知资源消耗大、执行耗时长、执行次数频繁的SQL语句。可根据诊断建议进行优化,保持数据库性能的稳定性。SQL诊断功能会获取相关表结构和数据分布信息(非原始数据),该信息仅用于诊断逻辑,不会存储到DAS服务器。获取表结构和数据分布信息的过程中,可能会对实例带来额外负载,但对性能影响甚微。SQL诊断历史是唯一存储在DAS服务器上的数据,如果执行删除操作后,也将彻底从服务器上删除。登录到数据管理服务控制台。在顶部菜单栏选择“SQL窗口”>“SQL诊断”,进入SQL诊断页面。图1 SQL诊断-1在SQL诊断页面,单击“新增SQL性能诊断”,新增SQL诊断任务。在新增SQL性能诊断弹出框中,您根据实际需要选择输入SQL语句或者上传SQL文件,然后单击“确定”,完成创建SQL诊断任务。图2 SQL诊断-2图3 SQL诊断-3在SQL诊断列表页面,您可选择“数据库”、“日期范围”单击“搜索”,进行筛选诊断报告。在诊断列表中,您可在“操作”栏查看诊断详情。图4 SQL诊断任务查询在SQL诊断详情页面,您可了解本次诊断任务的基本信息、诊断状态预览、诊断列表,并查看SQL列表中SQL诊断详情内容,获取语句优化建议等信息。图5 SQL诊断详情图6 诊断详情说明:SQL诊断功能会获取相关表结构和数据分布信息(非原始数据),该信息仅用于诊断逻辑,不会存储到DAS服务器。获取表结构和数据分布信息的过程中,可能会对实例带来额外负载,但对性能影响甚微。SQL诊断历史是唯一存储在DAS服务器上的数据,如果执行删除操作后,也将彻底从服务器上删除。
-
故障描述客户端无法连接数据库,连接数据库时返回如下报错信息:故障一ERROR 1045 (28000): Access denied for user ‘root'@‘192.168.0.30' (using password:YES)故障二ERROR 1226 (42000):User‘test' has exceeded the‘max_user_connections' resource (current value:10)故障三ERROR 1129 (HY000): Host ‘192.168.0.111' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'故障一排查密码root账号的密码是否正确。一般情况下,ERROR 1045报错为密码错误引起的,因此需要首要排除是否密码错误问题。select password(‘Test1i@123'); select host,user,Password from mysql.user where user=‘test1';使用错误的密码登录就会失败。确认该主机是否有连接数据库实例的权限。select user, host from mysql.user where user=‘username';如果该数据库用户需要从其他主机登录,则需要使用root用户连接数据库,并给该用户授权。以加入主机IP为192.168.0.76举例:GRANT all privileges ON test.* TO 'test1'@'192.168.0.76' identified by 'Test1i@123';flush privileges;确认MySQL客户端和实例VIP的连通性。尝试进行ping连接性能,若可以ping通,排除telnet数据库端口的问题。查看实例安全组,排查是否因安全策略问题引起的报错。查询user表信息,确认用户信息。在排查中发现存在两个root用户。如果用户的客户端处于192.168的网段,MySQL数据库的是对root@'192.168.%'这个用户进行认证的。而用户登录时使用的为root@'%'这个帐号所对应的密码,因而导致连接失败,无法正常访问。此次问题是因密码错误引起的访问失败。说明: 在此案例中,root@'%'为console创建实例时设置密码的帐号。故障二排查是否在创建MySQL用户时,添加了max_user_connections选项,导致限制了连接数。select user,host ,max_user_connections from mysql.user where user=‘test';经排查发现由于设置了max_user_connections选项,导致连接失败。增加该用户最大连接数。alter user test@‘192.168.0.100' with max_user_connections 15。查询变更结果,检查是否可正常访问数据库。故障三排查是否由于MySQL客户端连接数据库的失败次数(不包括密码错误),超过了max_connection_errors的值。在数据库端解除超出限值问题。使用root用户登录mysql,执行flush hosts。或者执行如下命令。mysqladmin flush-hosts –u<user> –p<password> -h<ip> -P<port >。再次连接,检查是否可正常访问数据库。
-
通过JDBC连接实例的方式有无需下载SSL证书连接和用户下载SSL证书连接两种,其中使用SSL证书连接通过了加密功能,具有更高的安全性。MySQL新实例默认关闭SSL数据加密,开启SSL请参考设置SSL数据加密。SSL连接实现了数据加密功能,但同时也会增加网络连接响应时间和CPU消耗,不建议开启SSL数据加密。前提条件用户需要具备以下技能:熟悉计算机基础知识。了解java编程语言。了解JDBC基础知识。使用SSL证书连接说明: 该方式属于SSL连接模式,需要下载SSL证书,通过证书校验并连接数据库。可以在华为云的“实例管理”页面,单击实例名称进入“基本信息”页面,单击“数据库信息”模块“SSL”处的下载按钮,下载根证书或**包。通过JDBC连接MySQL数据库,代码中的JDBC链接格式如下:jdbc:mysql://<instance_ip>:<instance_port>/<database_name>?sslmode=verify-full&sslrootcert=<ca.pem>参数说明<instance_ip>如果通过弹性云服务器连接,“instance_ip”是主机IP,即“基本信息”页面该实例的“内网地址”。如果通过连接了公网的设备访问,“instance_ip”为该实例已绑定的“弹性公网IP”。<instance_port>端口,默认3306,当前端口,参考“基本信息”页面该实例的“数据库端口”。<database_name>数据库名,即需要连接的数据库名(默认的管理数据库是mysql)。sslmodessl连接模式,默认全认证模式。sslrootcertssl连接CA证书路径,该文件需放在执行该命令的路径下。连接MySQL数据库的java代码,可参考以下示例:import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.sql.SQLException; public class MyConnTest { final public static void main(String[] args) { Connection conn = null; Statement stat = null; // set sslmode here. // with ssl certificate and path. String url = "jdbc:mysql://192.168.0.225:3306/my_db_test?sslmode=verify-full&sslrootcert=/home/Ruby/ca.pem"; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, "root", "password"); System.out.println("Database connected"); Statement stmt = conn.createStatement(); String sql = "SELECT * FROM mytable WHERE columnfoo = 500"; ResultSet rs = stmt.executeQuery sql); while (rs.next()) { System.out.println(rs.getString(1)); } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("Test failed"); } finally { // release resource .... } } }无证书连接说明: 该方式属于SSL连接模式,但不对服务端进行证书校验,用户无需下载SSL证书。通过JDBC连接MySQL数据库实例,代码中的JDBC链接格式如下:jdbc:mysql://<instance_ip>:<instance_port>/<database_name>?sslmode=require参数说明<instance_ip>如果通过弹性云服务器连接,“instance_ip”是主机IP,即“基本信息”页面该实例的“内网地址”。如果通过连接了公网的设备访问,“instance_ip”为该实例已绑定的“弹性公网IP”。<instance_port>端口,默认3306,当前端口,参考“基本信息”页面该实例的“数据库端口”。<database_name>数据库名,即需要连接的数据库名(默认的管理数据库是mysql)。sslmodessl连接模式,require模式表示进行数据加密。连接MySQL数据库的java代码,可参考以下示例:import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class MyConnTest { final public static void main(String[] args) { Connection conn = null; // set sslmode here. // no ssl certificate, so do not specify path. String url = "jdbc:mysql://192.168.0.225:3306/my_db_test?sslmode=require"; try { Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection(url, "root", "password"); System.out.println("Database connected"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500"); while (rs.next()) { System.out.println(rs.getString(1)); } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("Test failed"); } finally { // release resource .... } } }
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签