• [技术干货] Mysql的三种分页方法
    limit m,n分页语句 select * from dept order by deptno desc limit 3,3; select * from dept order by deptno desc limit m,n; limit 3,3的意思扫描满足条件的3+3行,撇去前面的3行,返回最后的3行,那么问题来了,如果是limit 200000,200,需要扫描200200行,如果在一个高并发的应用里,每次查询需要扫描超过20W行,效率十分低下。 建立主键或唯一索引, 利用索引(假设每页10条)  SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) LIMIT M。  select * from dept where deptno >10 order by deptno asc limit n;//下一页  select * from dept where deptno <60 order by deptno desc limit n//上一页 适应场景: 适用于数据量多的情况(元组数上万)。 这种方式不管翻多少页只需要扫描n条数据。 基于索引再排序 方法2 虽然扫描的数据量少了,但是在某些需要跳转到多少也得时候就无法实现,这时还是需要用到方法1,既然不能避免,那么我们可以考虑尽量减小m的值,因此我们可以给这条语句加上一个条件限制。是的每次扫描不用从第一条开始。这样就能尽量减少扫描的数据量。 例如:每页10条数据,当前是第10页,当前条目ID的最大值是109,最小值是100. 那么跳到第9页: select * from dept where deptno<100 order by desc limit 0,10; 那么跳到第8页: select * from dept where deptno<100 order by desc limit 10,10; 那么跳到第11页: select * from dept where deptno>109 order by asc limit 0,10; 那么跳到第11页: select * from dept where deptno>109 order by asc limit 10,10; ———————————————— 原文链接:https://blog.csdn.net/qq_16570607/article/details/118410492 
  • [技术干货] MySql中json类型的使用___mybatis存取mysql中的json
    MySql中json类型的使用 MySQL是数据库管理系统中的一种,是市面上最流行的数据库管理软件之一。据统计,MySQL是目前使用率最高的数据库管理软件,如下图所示。知名企业比如淘宝、网易、百度、新浪、Facebook等大部分互联网公司都在使用MySQL,而且不仅仅是互联网领域,许多游戏公司也在使用MySQL,比如劲舞团、魔兽世界之类我们熟知的游戏。甚至连中国移动、中国电网这样的知名国企也在使用MySQL。由此可知,MySQL的受众的非常广的。MySQL从5.7.8起开始支持JSON字段,这极大的丰富了MySQL的数据类型。也方便了广大开发人员。但MySQL并没有提供对JSON对象中的字段进行索引的功能,至少没有直接对其字段进行索引的方法。本文将介绍利用MySQL 5.7中的虚拟字段的功能来对JSON对象中的字段进行索引。 一、使用json的目的 1、可以直接过滤记录 2、可以直接update,而无须先读取 3、可以在一条SQL中完成多条纪录的修改! 4、通过json类型,完美的实现了表结构的动态变化 5、通过计算生成列且在该列上建立索引。提高查询效率 二、开始使用 1.建表 建表语句如下: CREATE TABLE `msg_info` (   `id` int(10) unsigned NOT NULL,   `message` json NOT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 2.插入数据 insert into msg_info values (1,'{"name":"zhangsan","phone":"13752763211"}'); insert into msg_info values (2,'{"name":"lisi","phone":"13752763222"}'); 3.查询更新操作 1、过滤记录 select * from    msg_info where message->'$.phone'='13752763211'; 2、查询json内指定字段 select message->'$.name' from    msg_info; # 这样查询出来的字段是带双引号的,使用如下语句可去除双引号,也可以使用关键字JSON_UNQUOTE select message->>'$.name' from    msg_info; 3、直接更新json串内的字段内容 UPDATE msg_info set message = JSON_SET(message, '$.name', 'lili') WHERE id = 1; # 为json串添加字段 update msg_info set message = JSON_INSERT(message, '$.age', 30) WHERE id = 1; 3.动态扩展字段 1、为json添加虚拟字段 ALTER TABLE msg_info  ADD v_phone  varchar (12) GENERATED ALWAYS  AS (JSON_UNQUOTE(message->'$.phone' )); 2、为虚拟字段创建索引,提高查询效率  # 通过执行计划可以查看创建索引前后的变化 ALTER TABLE msg_info ADD INDEX idx_phone(v_phone); mybatis存取mysql中的json mysql 5.7后新增了一个json类型字段,以往json入库都是转字符串,取到前端造成了不少困扰。今天就做了个小例子把这个整合到ssm例子中。 这边也顺便说下如果idea在启动tomcat客户端控制台出现乱码处理办法 打开idea安装目录-bin 用记事本打开idea.exe.vmoptions和idea64.exe.vmoptions文件 在文件后面添加一行:-Dfile.encoding=UTF-8 好了进入正题 第一步先配置一个typehandler,代码如下 import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;   import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig.Feature; import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;   /**  * mapper里json型字段到类的映射。  * 用法一:  * 入库:#{jsonDataField, typeHandler=com.adu.spring_test.mybatis.typehandler.JsonTypeHandler}  * 出库:  * <resultMap>  * <result property="jsonDataField" column="json_data_field" javaType="com.xxx.MyClass" typeHandler="com.adu.spring_test.mybatis.typehandler.JsonTypeHandler"/>  * </resultMap>  *  * 用法二:  * 1)在mybatis-config.xml中指定handler:  *      <typeHandlers>  *              <typeHandler handler="com.adu.spring_test.mybatis.typehandler.JsonTypeHandler" javaType="com.xxx.MyClass"/>  *      </typeHandlers>  * 2)在MyClassMapper.xml里直接select/update/insert。  *  */ public class JsonTypeHandler<T extends Object> extends BaseTypeHandler<T> {     private static final ObjectMapper mapper = new ObjectMapper();     private Class<T> clazz;       public JsonTypeHandler(Class<T> clazz) {         if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null");         this.clazz = clazz;     }       @Override     public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {         ps.setString(i, this.toJson(parameter));     }       @Override     public T getNullableResult(ResultSet rs, String columnName) throws SQLException {         return this.toObject(rs.getString(columnName), clazz);     }       @Override     public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {         return this.toObject(rs.getString(columnIndex), clazz);     }       @Override     public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {         return this.toObject(cs.getString(columnIndex), clazz);     }       private String toJson(T object) {         try {             return mapper.writeValueAsString(object);         } catch (Exception e) {             throw new RuntimeException(e);         }     }       private T toObject(String content, Class<?> clazz) {         if (content != null && !content.isEmpty()) {             try {                 return (T) mapper.readValue(content, clazz);             } catch (Exception e) {                 throw new RuntimeException(e);             }         } else {             return null;         }     }       static {         mapper.configure(Feature.WRITE_NULL_MAP_VALUES, false);         mapper.setSerializationInclusion(Inclusion.NON_NULL);     } mapper代码  <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"         "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.cm.dao.UserDao">       <resultMap id="user" type="com.cm.model.UserModel">         <id column="id" jdbcType="NUMERIC" property="id"/>         <result column="name" jdbcType="VARCHAR" property="name"/>         <result column="age" jdbcType="NUMERIC" property="age"/>         <result column="hobby" jdbcType="NUMERIC" property="hobby" typeHandler="com.cm.mybaits.JsonTypeHandler"/>       </resultMap>     <select id="getAllUsers" resultMap="user">         select * from user     </select>           <insert id="addUser">         <!--ignore忽略自动增长的主键id-->         insert ignore into user (name, age, hobby) values (#{id}, #{name} ,#{hobby, typeHandler=com.cm.mybaits.JsonTypeHandler})     </insert>           <update id="updateUser">         update user set name=#{name} where id=#{id}     </update>       <delete id="deleteUser" parameterType="String">         delete from user where id=#{id}     </delete>       <select id="getUser" resultType="UserModel">         select * from user where id = #{id}     </select> </mapper>  mysql表结构  插入的测试代码 效果预览 入库 取数据 这边有个坑是mysql 驱动一定要5.1.40,不然取出来的json中文是乱码。虽然说是低于5.1.36会乱码,但是我试了5.1.6还是乱码。 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>5.1.40</version> </dependency> ———————————————— 原文链接:https://blog.csdn.net/qq_43842093/article/details/122612071 
  • [其他] Inndb如何实现事务
    InnoDB是MySQL数据库的一种存储引擎,它支持事务处理。在InnoDB中,事务通过Buffer Pool、LogBuffer、Redo Log和Undo Log来实现。下面我们来详细介绍一下这些组件的作用以及它们如何协同工作来实现事务。    1. Buffer Pool  Buffer Pool是InnoDB中的一个重要组件,它用于缓存磁盘上的数据页。当一个事务需要读取或修改数据时,InnoDB会首先从Buffer Pool中查找相应的数据页。如果Buffer Pool中有该数据页,则可以直接使用;否则,InnoDB会从磁盘上读取该数据页并放入Buffer Pool中。这样可以大大提高数据的访问速度。    2. LogBuffer  LogBuffer是InnoDB中的另一个重要组件,它用于记录所有对数据库进行的操作。当一个事务执行修改操作时,InnoDB会将该操作记录到LogBuffer中。如果该事务执行了提交操作,则LogBuffer中的记录会被写入磁盘上的redo log文件中;如果该事务执行了回滚操作,则LogBuffer中的记录会被删除。这样可以保证数据的一致性和完整性。    3. Redo Log  Redo Log是InnoDB中的一个日志文件,它用于记录所有对数据库进行的修改操作。当一个事务执行修改操作时,InnoDB会将该操作记录到Redo Log中。如果该事务执行了提交操作,则Redo Log中的记录会被写入磁盘上的redo log文件中;如果该事务执行了回滚操作,则Redo Log中的记录会被删除。这样可以保证数据的一致性和完整性。    4. Undo Log  Undo Log是InnoDB中的另一个日志文件,它用于记录所有对数据库进行的修改操作的撤销操作。当一个事务执行回滚操作时,InnoDB会将该操作记录到Undo Log中。如果该事务执行了提交操作,则Undo Log中的记录会被删除。这样可以保证数据的一致性和完整性。  以上就是InnoDB通过Buffer Pool、LogBuffer、Redo Log和Undo Log来实现事务的流程。当一个事务开始执行时,InnoDB会先检查当前是否有其他事务正在修改数据;如果没有其他事务正在修改数据,则将该数据锁定;然后将该事务的修改操作记录到LogBuffer中;最后将修改操作写入磁盘上的redo log文件中,并释放锁。如果该事务执行了回滚操作,则将撤销操作记录到Undo Log中;如果该事务执行了提交操作,则将LogBuffer中的记录写入磁盘上的redo log文件中,并释放锁。 
  • [其他] MyISAM和InnoDB的区别
    MyISAM和InnoDB是mysql的两种存储引擎。InnoDB:支持ACID(原子性、一致性、隔离性、持久性)特性的事务,并且支持4种隔离级别。支持行级锁和外键约束。不存储总行数。一个InnoDB引擎存储在一个文件空间,受操作系统文件大小的限制。主键索引采用聚簇索引,索引的数据域存数据文件本身,辅索引的数据域存主键的值;因此从辅索引查找数据需要先通过辅索引找到主键值再访问。因此最好通过自增主键防止插入数据时为了维持B+树结构文件调整太大。MyISAM:不支持事务,但是查询时原子的。支持表级锁。存储表的总行数。一个MyISAM表有三个文件:索引文件、表结构文件、数据文件。采用非聚簇索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,单辅索引不保证唯一性。
  • [其他] MVCC介绍
    MVCC是多版本并发控制(Multi-Version Concurrency Control)的缩写,是一种数据库并发控制机制。它可以在多个用户同时访问同一数据时,保证每个用户看到的数据的版本是一致的,从而避免了脏读、不可重复读和幻读等问题。在MySQL中,MVCC是通过InnoDB引擎实现的 。
  • [其他] 事务的特性和隔离级别
    事务的特性原子性一个事务内的操作要不全部成功,要不全部失败。一致性在分布式事务系统中,多个节点进行一系列操作后最终达到全局一致的结果。通常采取一系列措施防止冲突和错误。2阶段提交(2PC)、3阶段提交(3PC)、补偿事务、分布式事务管理器。隔离性一个事务在最终提交前对其他事务是不可见的。持久性一个事务一旦提交,所修改的数据就持久保存到数据库中。隔离级别事务的隔离级别是指多个事务同时执行时,对同一数据进行操作时,保证数据的一致性和完整性的一种机制。不同的隔离级别可以解决不同的并发问题,如脏读、不可重复读和幻读等。可重复读默认级别读未提交读已提交串行
  • [技术干货] MySQL、PostgreSQL(PgSQL)和Oracle 插入和更新语句
    不同数据库管理系统(DBMS)使用不同的语句来实现插入和更新操作。下面是MySQL、PostgreSQL(PgSQL)和Oracle数据库的常用语句示例:插入数据MySQL在MySQL中,使用INSERT INTO语句来插入数据。以下是一个示例:INSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3);PostgreSQL (PgSQL)在PgSQL中,使用INSERT INTO语句来插入数据。以下是一个示例:INSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3);Oracle在Oracle中,使用INSERT INTO语句来插入数据。以下是一个示例:INSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3);更新数据MySQL在MySQL中,使用UPDATE语句来更新数据。以下是一个示例:UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;PostgreSQL (PgSQL)在PgSQL中,使用UPDATE语句来更新数据。以下是一个示例:UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;Oracle在Oracle中,使用UPDATE语句来更新数据。以下是一个示例:UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;请注意,上述示例中的table_name是表的名称,column1、column2等是要插入或更新的列名,value1、value2等是要插入或更新的值,condition是更新的条件。需要注意的是,不同的数据库管理系统可能有其特定的语法和规则,因此在实际使用时,请参考相应的数据库文档以了解更多详细信息和用法。
  • [技术干货] MyBatis实现MySQL的批量插入
    准备工作首先,我们需要确保以下几点:你已经安装了MySQL数据库,并且可以正常连接。你已经配置好了MyBatis的环境,并且可以成功执行单条插入语句。数据库表准备为了演示批量插入的过程,我们创建一个名为users的表,包含以下字段:CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100), email VARCHAR(100) );MyBatis映射文件我们需要编写一个MyBatis的映射文件,来定义插入操作的SQL语句。在这个例子中,我们将使用XML格式的映射文件。首先,创建一个名为UserMapper.xml的文件,并在其中添加以下内容:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.UserMapper"> <insert id="insertBatch" parameterType="java.util.List"> INSERT INTO users (name, email) VALUES <foreach collection="list" item="item" separator=","> (#{item.name}, #{item.email}) </foreach> </insert> </mapper>在上面的代码中,我们定义了一个名为insertBatch的插入语句。它接受一个java.util.List类型的参数,其中每个元素都是一个User对象。我们使用了<foreach>标签来循环遍历列表,并生成对应的插入语句。Java代码接下来,我们需要在Java代码中使用MyBatis执行批量插入操作。首先,我们需要创建一个User类来表示数据库中的用户:public class User { private String name; private String email; // 省略构造函数和getter/setter方法 }然后,我们可以编写一个UserMapper接口来定义批量插入操作的方法:public interface UserMapper { void insertBatch(List<User> users); }最后,在我们的Java代码中,我们需要使用SqlSessionFactory和SqlSession来执行批量插入操作。这里是一个简单的示例:String resource = "path/to/your/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper userMapper = session.getMapper(UserMapper.class); List<User> users = new ArrayList<>(); users.add(new User("John", "john@example .com")); users.add(new User("Alice", "alice@example.com")); userMapper.insertBatch(users); session.commit(); }在上面的代码中,我们首先使用SqlSessionFactoryBuilder来构建一个SqlSessionFactory实例,然后使用它来创建一个SqlSession。接着,我们获取UserMapper接口的实例,并创建一个包含要插入的用户数据的列表。最后,我们调用insertBatch方法执行批量插入,并在插入完成后调用commit方法提交事务。运行代码现在,我们已经完成了所有的准备工作。运行这段代码,MyBatis会将我们的用户数据批量插入到MySQL数据库中的users表中。总结在本文中,我们学习了如何使用MyBatis实现MySQL的批量插入操作。我们首先准备了数据库表和MyBatis的映射文件,然后编写了Java代码来执行批量插入操作。通过使用MyBatis的批量插入功能,我们可以显著提高插入大量数据的性能和效率。希望这篇博客能帮助到你,谢谢阅读!如果你有任何问题或疑问,欢迎提出。
  • [技术干货] MySQL 什么时候要分表、什么时候要分库
    在MySQL中,是否需要对表或数据库进行分区的决策取决于多种因素,如数据大小、性能要求、可扩展性需求和底层硬件基础设施。对于何时分区表或数据库,没有固定的阈值,因为它取决于具体的应用程序和工作负载。表分区: 当表的大小增长到影响查询性能、维护任务或存储需求时,分区表可能会很有用。以下是一些可能考虑使用表分区的情况:大型数据集:如果一个表包含数百万或数十亿行数据,并且由于数据量庞大而导致的查询变慢,分区可以通过允许数据库扫描或访问较小的数据子集来提高查询性能。维护操作:分区可以通过针对特定分区而不是整个表来进行备份、索引重建和数据归档等维护操作,从而使这些操作更加高效。数据生命周期管理:如果您的应用程序涉及存储很少被访问的历史数据,分区可以帮助进行数据管理。旧的分区可以移动到较慢的存储甚至归档,而最新的分区保留在更快的存储上。分区决策应该基于对应用程序具体需求和工作负载模式的仔细分析。分布式数据库(分片): 分片涉及将数据分布在多个数据库或实例中,以处理增加的数据量并提高性能。通常在单个数据库服务器无法处理应用程序的负载或存储需求时考虑分片。一些可能表明需要进行分片的因素包括:数据大小和增长:当数据的大小超过单个数据库服务器的容量或预计会超过其限制时,分片可以帮助将数据分布在多个服务器上。可扩展性需求:如果您的应用程序需要处理大量并发用户或处理大量事务,分片可以通过向集群添加更多服务器来提供横向扩展性。地理分布:当您需要将数据分布在多个地理位置以减少延迟或遵守数据驻留规定时,分片可以很有用。分片可能是一个复杂的过程,需要仔细的规划和实施,以确保数据一致性、查询路由和容错性。最终,在MySQL中对表或数据库进行分区的决策应该基于充分的分析、性能测试和对应用程序需求的了解。建议咨询数据库管理员或性能专家,他们可以评估您的具体情况
  • [技术干货] mysql函数之截取字符串
    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。 MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。练习截取字符串函数(五个) mysql索引从1开始 一、mysql截取字符串函数 1、left(str,length) 从左边截取length 2、right(str,length)从右边截取length 3、substring(str,index)当index>0从左边开始截取直到结束 当index<0从右边开始截取直到结束 当index=0返回空 4、substring(str,index,len) 截取str,从index开始,截取len长度 5、substring_index(str,delim,count),str是要截取的字符串,delim是截取的字段count是从哪里开始截取(为0则是左边第0个开始,1位左边开始第一个选取左边的,-1从右边第一个开始选取右边的 6、subdate(date,day)截取时间,时间减去后面的day 7、subtime(expr1,expr2) 时分秒expr1-expr2 二、mysql截取字符串的一些栗子 1、left(str,length) length>=0 从左边开始截取 2、right(str,length) length>=0 从右边开始截取 3、substring(str,index) =SUBSTRING(str FROM pos) 包括index这个位置的字符 4、substring(str,index,len) 截取str,从index开始,截取len长度 5、substring_index(str,delim,count),str是要截取的字符串,delim是截取的字段count是从哪里开始截取(为0则是左边第0个开始,1位左边开始第一个选取左边的,-1从右边第一个开始选取右边的 为1,从左边开始数第一个截取,选取左边的值 为-1,从右边开始数第一个截取,选取右边的值 特殊情况,字符串中没有指定的字符,则返回原字符串(index=0时候例外) 6、subdate(date,day)截取时间,时间减去后面的day 7、subtime(expr1,expr2)–是两个时间相减 ———————————————— 原文链接:https://blog.csdn.net/emgexgb_sef/article/details/124321520 
  • [其他] mysql表分区
     MySQL分区是将一个大的表分割成多个小的表,每个小表独立存储数据的一种方式。它可以提高查询效率、降低I/O负载和优化数据库性能。  MySQL支持以下几种分区方式:  1. 基于范围的分区:将数据按照一定范围进行分区,例如按日期、按ID等。这种方式适用于需要经常进行聚合查询的场景。  2. 基于列表的分区:将数据按照某个字段的值进行分区,例如按地区、按语言等。这种方式适用于需要根据某个字段进行查询的场景。  3. 基于散列的分区:将数据按照某个字段的散列值进行分区,例如按用户ID、按IP地址等。这种方式适用于需要根据某个字段进行快速查询的场景。  4. 动态分区:在运行时根据查询条件动态地创建或删除分区。这种方式适用于需要根据实时数据变化进行查询的场景。  在MySQL中,可以使用ALTER TABLE语句来创建分区。以下是一些常见的创建分区的方式:基于范围的分区:CREATE TABLE table_name ( id INT NOT NULL PRIMARY KEY, name VARCHAR(50), date DATE) PARTITION BY RANGE (date)( PARTITION p0 VALUES LESS THAN (TO_DATE('2022-01-01','YYYY-MM-DD')), PARTITION p1 VALUES LESS THAN (TO_DATE('2022-02-01','YYYY-MM-DD')), PARTITION p2 VALUES LESS THAN MAXVALUE);这个例子将表按照日期进行范围分区,分为p0、p1和p2三个分区。其中,p0分区包含所有日期早于2022年1月1日的数据,p1分区包含所有日期在2022年1月1日至2月1日之间的数据,p2分区包含所有日期晚于2022年2月1日的数据。基于列表的分区:CREATE TABLE table_name ( id INT NOT NULL PRIMARY KEY, name VARCHAR(50), region VARCHAR(50)) PARTITION BY LIST (region)( PARTITION p0 VALUES IN ('North', 'South'), PARTITION p1 VALUES IN ('East', 'West'));这个例子将表按照地区进行列表分区,分为p0和p1两个分区。其中,p0分区包含地区为'North'或'South'的数据,p1分区包含地区为'East'或'West'的数据。基于散列的分区:CREATE TABLE table_name ( id INT NOT NULL PRIMARY KEY, name VARCHAR(50), user_id BIGINT UNSIGNED, location VARCHAR(50), salary DOUBLE PRECISION, hire_date DATE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, PRIMARY KEY (id, user_id)) PARTITION BY HASH(user_id);这个例子将表按照用户ID的散列值进行分区,分为单个分区。其中,每个分区包含相同散列值的用户数据。注意,这里使用了FOREIGN KEY约束来保证数据的完整性。在MySQL中,可以使用PARTITION BY子句根据日期字段进行分区。以下是一个示例:CREATE TABLE orders ( order_id INT NOT NULL PRIMARY KEY, order_date DATE NOT NULL, customer_id INT NOT NULL, product_name VARCHAR(50) NOT NULL, quantity INT NOT NULL, price DOUBLE PRECISION NOT NULL, FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE, PRIMARY KEY (order_id, customer_id)) PARTITION BY RANGE (order_date);这个例子将表按照订单日期的范围进行分区,分为p0、p1和p2三个分区。其中,p0分区包含所有日期早于指定日期的数据,p1分区包含所有日期在指定日期和当天之间的数据,p2分区包含所有日期晚于当天的
  • [其他] mysql慢查询优化
    MySQL 慢查询是指执行时间较长的查询语句,如果查询语句执行时间过长,会影响数据库性能和用户体验。因此,对 MySQL 慢查询进行优化是非常必要的。以下是一些 MySQL 慢查询优化的方法:使用索引在经常用于搜索、排序和分组的列上创建索引可以大大提高查询效率。但是,不要过度使用索引,因为它会增加写入操作的成本。因此,需要根据实际情况来决定是否创建索引。避免使用 SELECT *只选择需要的列可以减少数据传输量,提高查询效率。因此,在编写查询语句时,应该尽量避免使用 SELECT *。优化 JOINJOIN 是 MySQL 中最常见的操作之一,但是它也会消耗大量的资源。可以使用 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 OUTER JOIN 等不同的方式来优化 JOIN。一般来说,INNER JOIN 是最优的选择。避免使用子查询子查询的效率比连接表要低得多,因此应该尽量避免使用子查询。如果必须使用子查询,可以考虑将子查询转换为 JOIN 或者使用临时表来提高效率。优化 WHERE 子句WHERE 子句中的条件可能会影响整个查询的性能,因此应该尽量避免使用复杂的条件。可以使用 EXISTS 或者 IN 等关键字来替代 WHERE 子句中的其他操作符。定期清理无用的数据定期清理无用的数据可以释放磁盘空间,提高数据库性能。可以使用 MySQL 自带的工具或者第三方工具来进行数据清理。使用缓存使用缓存可以减少对数据库的访问次数,提高查询效率。可以使用 MySQL 自带的缓存或者第三方缓存工具来进行缓存。需要注意的是,缓存并不是万能的,有些查询可能需要实时获取数据,因此不能完全依赖缓存。优化表结构优化表结构可以提高数据库的性能。例如,可以将大字段拆分为多个小字段,或者将多列合并为一列。需要注意的是,优化表结构需要根据实际情况来进行,不能盲目地进行优化。优化服务器配置优化服务器配置可以提高数据库的性能。例如,增加内存、使用 SSD 硬盘等。需要注意的是,服务器配置的优化需要根据实际情况来进行,不能盲目地进行优化。
  • [其他] mysql基础梳理
    1.MyIAm和InnoDB的区别InnoDB支持事务,MyIAm不支持InnoDB支持外键,MyIAm不支持InnoDB是聚簇索引,MyIAm是非聚簇索引InnoDB支持行锁和表锁,MyIAm只支持表锁InnoDB不支持全文索引,MyIAm支持InnoDB支持自增和MVCC模式的读写,MyIAm不支持2.mysql事务特性原子性:一个事务内的操作统一成功或失败一致性:事务前后的数据总量不变隔离性:事务与事务之间相互不影响持久性:事务一旦提交发生的改变不可逆3.事务靠什么保证原子性:由undolog日志保证,他记录了需要回滚的日志信息,回滚时撤销已执行的sql一致性:由其他三大特性共同保证,是事务的目的隔离性:由MVCC保证持久性:由redolog日志和内存保证,mysql修改数据时内存和redolog会记录操作,宕机时可恢复4.事务的隔离级别在高并发情况下,并发事务会产生脏读、不可重复读、幻读问题,这时需要用隔离级别来控制读未提交: 允许一个事务读取另一个事务已提交的数据,可能出现不可重复读,幻读。读提交:    只允许事务读取另一个事务没有提交的数据可能出现不可重复读,幻读。可重复读: 确保同一字段多次读取结果一致,可能出现欢幻读。可串行化: 所有事务逐次执行,没有并发问日Inno DB 默认隔离级别为可重复读级别,分为快照度和当前读,并且通过间隙锁解决了幻读问题。5.什么是快照读和当前读*快照读读取的是当前数据的可见版本,可能是会过期数据,不加锁的select就是快照都*当前读读取的是数据的最新版本,并且当前读返回的记录都会上锁,保证其他事务不会并发修改这条记录。如update、insert、delete、select for undate(排他锁)、select lockin share mode(共享锁) 都是当前读6.MVCC是什么MVCC是多版本并发控制,为每次事务生成一个新版本数据,每个事务都由自己的版本,从而不加锁就决绝读写冲突,这种读叫做快照读。只在读已提交和可重复读中生效。实现原理由四个东西保证,他们是undolog日志:记录了数据历史版本readView:事务进行快照读时产生的视图,记录了当前系统中活跃的事务id,控制哪个历史版本对当前事务可见隐藏字段DB_TRC_ID: 最近修改记录的事务ID隐藏字段DB_Roll_PTR: 回滚指针,配合undolog指向数据的上一个版本7.MySQL有哪些索引主键索引:一张表只能有一个主键索引,主键索引列不能有空值和重复值唯一索引:唯一索引不能有相同值,但允许为空普通索引:允许出现重复值组合索引:对多个字段建立一个联合索引,减少索引开销,遵循最左匹配原则全文索引:myisam引擎支持,通过建立倒排索引提升检索效率,广泛用于搜索引擎8.聚簇索引和非聚簇索引的区别聚簇索引:将索引和值放在了一起,根据索引可以直接获取值,如果主键值很大的话,辅助索引也会变得很大非聚簇索引:叶子节点存放的是数据行地址,先根据索引找到数据地址,再根据地址去找数据他们都是b+数结构9.B和B+数的区别,为什么使用B+数二叉树:索引字段有序,极端情况会变成链表形式AVL数:树的高度不可控B数:控制了树的高度,但是索引值和data都分布在每个具体的节点当中,若要进行范围查询,要进行多次回溯,IO开销大B+树:非叶子节点只存储索引值,叶子节点再存储索引+具体数据,从小到大用链表连接在一起,范围查询可直接遍历不需要回溯710.MySQL有哪些锁基于粒度:*表级锁:对整张表加锁,粒度大并发小*行级锁:对行加锁,粒度小并发大*间隙锁:间隙锁,锁住表的一个区间,间隙锁之间不会冲突只在可重复读下才生效,解决了幻读基于属性:*共享锁:又称读锁,一个事务为表加了读锁,其它事务只能加读锁,不能加写锁*排他锁:又称写锁,一个事务加写锁之后,其他事务不能再加任何锁,避免脏读问题11.MySQL如果做慢查询优化(1)分析sql语句,是否加载了不需要的数据列(2)分析sql执行计划,字段有没有索引,索引是否失效,是否用对索引(3)表中数据是否太大,是不是要分库分表12.哪些情况索引会失效(1)where条件中有or,除非所有查询条件都有索引,否则失效(2)like查询用%开头,索引失效(3)索引列参与计算,索引失效(4)违背最左匹配原则,索引失效(5)索引字段发生类型转换,索引失效(6)mysql觉得全表扫描更快时(数据少),索引失效13.Mysql内连接、左连接、右连接的区别内连接取量表交集部分,左连接取左表全部右表匹部分,右连接取右表全部坐表匹部分
  • [其他] mysql分区
    MySQL数据库在存储大量数据时,需要将数据按照一定的规则进行分区,这样可以更好地管理和维护数据。下面我们就来介绍一下mysql数据库如何分区。1.确定表结构在进行数据分表之前,我们需要先确定表的结构。表的结构应该包含表名、字段名、数据类型、是否主键、是否可空、是否唯一等信息。在确定表结构时,可以使用DESC和DESCRIBE命令来查看表的具体信息。2. 确定表分区我们可以根据数据量、读写比例等因素来确定表的分区。如果数据量很大,可以将表按照某个列或多个列进行分区;如果读写比例很高,可以将读操作分散到多个表上,从而减轻单个表的负载。3. 创建分区表在确定了表的分区方案后,我们可以使用ALTER TABLE命令来创建分区表。ALTER TABLE命令可以添加一个分区属性,用于指定表使用的分区方案。ALTER TABLE命令的语法如下:ALTER TABLE table_name ADD PARTITION (partition_column datatype, ...);其中,partition_column是分区列,datatype是数据类型,可以是INT、VARCHAR、DATE、TIMESTAMP等。4. 确定分区间我们需要确定每个分区的范围,即哪些数据属于哪个分区。这可以通过使用PARTITION BY子句来实现。PARTITION BY子句可以指定多个列,用于指定数据属于哪个分区。例如,我们可以使用以下语句来创建一个分区表,将数据按照日期进行分区:CREATE TABLE my_table ( id INT PRIMARY KEY, date DATE ) PARTITION BY RANGE( YEAR(date) ) ( PARTITION p2014 VALUES LESS THAN (2015), PARTITION p2015 VALUES LESS THAN (2016), PARTITION p2016 VALUES LESS THAN (2017), PARTITION p2017 VALUES LESS THAN (2018) );在上面的语句中,PARTITION BY语句指定了数据属于哪个分区,RANGE关键字指定了分区的范围,即以年为分区标准。VALUES子句指定了分区的值范围,即小于等于2015的数据属于p2014分区,小于等于2016的数据属于p2015分区,以此类推。调整分区大小 我们可以使用ALTER TABLE命令来调整分区的大小。ALTER TABLE命令的语法如下:ALTER TABLE table_name ENGINE = INNODB;其中,ENGINE是数据库引擎,INNODB是mysql的默认引擎,可以使用它来提高分区表的性能。通过上述步骤,我们就可以成功地将mysql数据库的数据按照一定的规则分成多个表。这样可以更好地管理和维护数据,提高查询效率,同时也可以减轻单个表的负载,提高数据的存储能力。
  • [问题求助] hash索引基于什么考虑,不支持范围查询?
    hash索引基于什么考虑,不支持范围查询?
总条数:1406 到第
上滑加载中