mysql在linux上的安装:
首先下载下来
其次解压到一个目录,例如 usr/local
mysqld 启动mysql数据库服务。
脚本启动mysql服务的命令是 net start mysql,这是怎么回事?
这里的mysql是一个服务名称,执行services.msc,可以看到mysql服务,执行路径是 xxx\mysqld --defaults-file=xxx,可认为mysql这个服务是mysqld 的别名,net start mysql 就是运行 mysqld程序。
mysqld是用来启动mysql数据库的命令,mysql是打开并执行sql语句的命令。
这两个都在mysql安装文件夹的bin目录下。
mysqld:SQL后台程序(即MySQL服务器)。要想使用客户端程序,该程序必须运行,因为客户端通过连接服务器来访问数据库。
mysql:交互式输入SQL语句或从文件以批处理模式执行它们的命令行工具。
mysqld,也被称为MySQL服务器,是主程序,大部分工作用于MySQL的安装。
数据和日志可以不用管
如何添加全局变量?
vim /etc/profile
1 :首先在此文件中设置环境变量;
2:export 设置好的环境变量.
export PATH="变量路径"
举例
export JAVA_HOME=/usr/java/jdk1.8.0_60
export PATH=$JAVA_HOME/bin:$PATH
更新权限 source profile
/etc/profile:该文件是用户登录时,操作系统定制用户环境时使用的第一个文件,应用于登录到系统的每一个用户。
/etc/profile.d/xxx.sh:/etc/profile.d 目录下的所有xxx.sh 文件,都会被 /etc/profile 执行,所以对于用户自定义的全局环境变量,一般都是在 /etc/profile.d/目录下新建一个.sh 脚本文件,把自己想要定义的变量写入这个脚本中即可。那么系统在启动之后,就会自动执行,并且对所有用户都是可见的。
~/.bash_profile:每个用户都可以使用该文件,来输入属于自己的shell信息。当用户登录时,该文件仅仅执行一次!!!默认情况下,他设置一些环境变量,执行用户的.bashrc 文件。(推荐!!!)
~/.bashrc:该文件包含专属于你自己的 bash shell 的 bash 信息。当用户登录以及每次打开新的shell时,该文件都会被读取。(不推荐将变量放置在这儿,因为每打开一个shell,这个文件就会被读取一次,效率肯定是有影响的)
如何开启mysql
因为mysql会用到外部文件,因此搞个权限还是有必要的
sudo mkdir -p /data/mysql/data
sudo mkdir -p /var/run/mysqld
说实在的,不知道为嘛要新搞个用户什么的
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。
MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。
而且基本各大linux都删除了mysql,真是有够离谱
1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。
2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。
3、 text不设置长度, 当不知道属性的最大长度时,适合用text。
按照查询速度: char最快, varchar次之,text最慢。
char:char(n)中的n表示字符数,最大长度是255个字符; 如果是utf8编码方式, 那么char类型占255 * 3个字节。(utf8下一个字符占用1至3个字节)
varchar:varchar(n)中的n表示字符数,最大空间是65535个字节, 存放字符数量跟字符集有关系;
MySQL5.0.3以前版本varchar(n)中的n表示字节数;
MySQL5.0.3以后版本varchar(n)中的n表示字符数;
PS:varchar实际范围是65532或65533, 因为内容头部会占用1或2个字节保存该字符串的长度;如果字段default null(即默认值为空),整条记录还需要1个字节保存默认值null。
如果是utf8编码, 那么varchar最多存65532/3 = 21844个字符。
顺便提一句: 当表有成百上千万条数据时, 就要使用MySQL的分区(partition)功能, 原理有点像分治算法,就是将数据切割成多个部分。
索引组织表
在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键(Primary Key),如果在创建表时没有显式地定义主键,则InnoDB存储引擎会按如下方式选择或创建主键
1:首先判断表中是否有非空的唯一索引,如果有,则该列即为主键
2:如果不符合上述条件,InnoDB存储引擎自动创建一个6字节大小的指针
当表中有多个非空唯一索引时,InnoDB存储引擎将选择建表时第一个定义的非空唯一索引为主键。
从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间(tablespace).表空间又由段(segment),区(extent)、页(page)组成。
MyISAM:对整张表进行加锁,锁全表而不是行。在读数据的时候,所有的表上都可以获得共享锁(读锁),每个连接都不互相干扰。在写的时候,或者排他锁,会把整个表进行加锁,而其他的连接请求(读和写)都处于等待。
MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。
1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
3. InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。
MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
也就是说:InnoDB的B+树主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的值;而MyISAM的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针。
如何选择:
1. 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
2. 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读也有写,请使用InnoDB。
3. 系统奔溃后,MyISAM恢复起来更困难,能否接受;
4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。
MySQL主键设计原则
- MySQL主键应当是对用户没有意义的。
- MySQL主键应该是单列的,以便提高连接和筛选操作的效率
- 永远也不要更新MySQL主键
- MySQL主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等
- MySQL主键应当有计算机自动生成。
就是自增ID,怎么设计呢?
CREATE TABLE user_t
(
id
int(11) NOT NULL AUTO_INCREMENT,
user_name
varchar(40) NOT NULL,
password
varchar(255) NOT NULL,
age
int(4) NOT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
复制代码
如上所示,通常会给主键加上 not null,auto_increment ,primary key 甚至UNSINGED 这些属性,我们可以通过这些属性去了解主键他的特性。
实际上就这么几种比较重要的属性,非空是最重要的属性了,然后就没了。
int(M) 在 integer 数据类型中,M 表示最大显bai示宽度。du
在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何zhi关系。 int(3)、daoint(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。说白了,除了显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。
综合上述:int(10)表示的是数据显示的长度为10位。
表示时间值的日期和时间类型为 DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
按理说你应该用DATETIME或者TIMESTAMP,对于跨时区的业务,TIMESTAMP更为合适。用TIMESTAMP吧。
view,是mysql的一项功能,是一种逻辑表,本身并不包含数据,而是从基本表生成的
可以简化操作,突出重点,提高数据安全性等等,也是通过sql语句创建的
diagram,是可视化图表,可以清晰看出表结构与其他表的关联性
procedure,存储过程,是一组完成某项功能的sql语句集合,存起来方便以后使用,所以叫存储过程
也是通过sql语句构建,有封装性与高性能的特点
function,顾名思义,函数了,例如NOW()是返回当前时间
trigger,触发器,在满足某种条件时触发,可以协助应用在数据库端确保数据的完整性
例如,插入一个用户条目后触发在日志中写入,这样。
- 1.第一种方式 匿名参数 顺序传递参数
- 2.第二种方式 使用@Param注解
- 3.使用Map传递参数
- 4.用过java bean传递多个参数
- 5.直接使用JSON传递参数
- 6.传递集合类型参数List、Set、Array
- 7.参数类型为对象+集合
<select id="selectByGenderAndAge" resultMap="BaseResultMap" >
select * from employee where gender = #{param1} and age = #{param2}
</select>
匿名传参,注意只能按顺序来,并且只能是固定名称,优点是简单,一个配置都没有
第二种
List<Employee> selectByGenderAndAge( @Param("gender") Short gender,@Param("age") String age );
<select id="selectByGenderAndAge" resultMap="BaseResultMap" >
select * from employee where gender = #{gender} and age = #{age}
</select>
然后直接用就可以了,这个是最好的方式。
第三种使用map传参,这个更符合设计模式
<select id="selectByMapParams" resultMap="BaseResultMap" parameterType="map">
select * from employee where gender = #{gender} and age = #{age}
</select>
注意也可以直接使用名字来进行调用。
@ApiOperation(value = "多个参数查询_通过Java Bean传递多个参数")
@PostMapping("findByBeans")
public ResultMsg findByBeans(@RequestBody Employee employee)
{
List result= employeeMapper.selectByBeans(employee);
return ResultMsg.getMsg(result);
}
这个问题 是你没法不进行处理就直接来造吧?
还可以直接使用json,越来越邪乎。
在MyBatis(使用版本3.4.6,早期版本不支持)中insert、update、delete语句的返回值可以是Integer、Long和Boolean。在定义Mapper接口时直接指定需要的类型即可,无需在对应的<insert><update><delete>标签中显示声明。
对应的代码在 org.apache.ibatis.binding.MapperMethod 类中,如下:
- 对于insert、update、delete语句,MyBatis都会使用 rowCountResult 方法对返回值进行转换;
- rowCountResult 方法会根据Mapper声明中方法的返回值类型来对参数进行转换;
- 对于返回类型为Boolean的情况,如果返回的值大于0,则返回True,否则返回False
真牛逼。
Entity必须与mapper完全一致,若不一致用map代替才行。