重新学习MySQL数据库12:从实践sql语句优化开始

KEGG数据库与KAAS工具:基因功能注释的实用指南 本文提供了使用KEGG数据库与KAAS工具进行基因功能注释的完整实用指南。详细阐述了如何从准备基因或蛋白序列开始,通过KAAS服务器获取KEGG Orthology(KO)编号,并解读注释结果。文章进一步介绍了如何利用KOBAS工具进行通路富集分析,将定性观察转化为定量洞察,并分享了提高注释准确率、处理大数据集及使用API等避坑技巧与高阶方法,为基因组学、转录组学研究者奠定坚实的数据分析基础。 阅读详情

除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量:

字段

  • 尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED

  • VARCHAR的长度只分配真正需要的空间

  • 使用枚举或整数代替字符串类型

  • 尽量使用TIMESTAMP而非DATETIME,

  • 单表不要有太多字段,建议在20以内

  • 避免使用NULL字段,很难查询优化且占用额外索引空间

  • 用整型来存IP

索引

  • 索引并不是越多越好,要根据查询有针对性的创建,考虑在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是否用了索引还是全表扫描

  • 应尽量避免在WHERE子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描

  • 值分布很稀少的字段不适合建索引,例如"性别"这种只有两三个值的字段

  • 字符字段只建前缀索引

  • 字符字段最好不要做主键

  • 不用外键,由程序保证约束

  • 尽量不用UNIQUE,由程序保证约束

  • 使用多列索引时主意顺序和查询条件保持一致,同时删除不必要的单列索引

查询SQL

  • 可通过开启慢查询日志来找出较慢的SQL

  • 不做列运算:SELECT id WHERE age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函数、计算表达式等等,查询时要尽可能将操作移至等号右边

  • sql语句尽可能简单:一条sql只能在一个cpu运算;大语句拆小语句,减少锁时间;一条大sql可以堵死整个库

  • 不用SELECT *

  • OR改写成IN:OR的效率是n级别,IN的效率是log(n)级别,in的个数建议控制在200以内

  • 不用函数和触发器,在应用程序实现

  • 避免%xxx式查询

  • 少用JOIN

  • 使用同类型进行比较,比如用'123'和'123'比,123和123比

  • 尽量避免在WHERE子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描

  • 对于连续数值,使用BETWEEN不用IN:SELECT id FROM t WHERE num BETWEEN 1 AND 5

  • 列表数据不要拿全表,要使用LIMIT来分页,每页数量也不要太大

引擎

目前广泛使用的是MyISAM和InnoDB两种引擎:

MyISAM

MyISAM引擎是MySQL 5.1及之前版本的默认引擎,它的特点是:

  • 不支持行锁,读取时对需要读到的所有表加锁,写入时则对表加排它锁

  • 不支持事务

  • 不支持外键

  • 不支持崩溃后的安全恢复

  • 在表有读取查询的同时,支持往表中插入新纪录

  • 支持BLOB和TEXT的前500个字符索引,支持全文索引

  • 支持延迟更新索引,极大提升写入性能

  • 对于不会进行修改的表,支持压缩表,极大减少磁盘空间占用

InnoDB

InnoDB在MySQL 5.5后成为默认索引,它的特点是:

  • 支持行锁,采用MVCC来支持高并发

  • 支持事务

  • 支持外键

  • 支持崩溃后的安全恢复

  • 不支持全文索引

总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表

0、自己写的海量数据sql优化实践

首先是建表和导数据的过程。

参考https://nsimple.top/archives/mysql-create-million-data.html

有时候我们需要对大数据进行测试,本地一般没有那么多数据,就需要我们自己生成一些。下面会借助内存表的特点进行生成百万条测试数据。

  1. 创建一个临时内存表, 做数据插入的时候会比较快些

SQL

-- 创建一个临时内存表DROP TABLE IF EXISTS `vote_record_memory`;CREATE TABLE `vote_record_memory` (    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,    `user_id` varchar(20) NOT NULL DEFAULT '',    `vote_num` int(10) unsigned NOT NULL DEFAULT '0',    `group_id` int(10) unsigned NOT NULL DEFAULT '0',    `status` tinyint(2) unsigned NOT NULL DEFAULT '1',    `create_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',    PRIMARY KEY (`id`),    KEY `index_user_id` (`user_id`) USING HASH) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 
  1. -- 创建一个普通表,用作模拟大数据的测试用例

SQL

DROP TABLE IF EXISTS `vote_record`;CREATE TABLE `vote_record` (    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,    `user_id` varchar(20) NOT NULL DEFAULT '' COMMENT '用户Id',    `vote_num` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '投票数',    `group_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户组id 0-未激活用户 1-普通用户 2-vip用户 3-管理员用户',    `status` tinyint(2) unsigned NOT NULL DEFAULT '1' COMMENT '状态 1-正常 2-已删除',    `create_time` int(10) unsigned NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',    PRIMARY KEY (`id`),    KEY `index_user_id` (`user_id`) USING HASH COMMENT '用户ID哈希索引') ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='投票记录表'; 
  1. 为了数据的随机性和真实性,我们需要创建一个可生成长度为n的随机字符串的函数。

SQL

-- 创建生成长度为n的随机字符串的函数DELIMITER // -- 修改MySQL delimiter:'//'DROP FUNCTION IF EXISTS `rand_string` //SET NAMES utf8 //CREATE FUNCTION `rand_string` (n INT) RETURNS VARCHAR(255) CHARSET 'utf8'BEGIN     DECLARE char_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';    DECLARE return_str varchar(255) DEFAULT '';    DECLARE i INT DEFAULT 0;    WHILE i < n DO        SET return_str = concat(return_str, substring(char_str, FLOOR(1 + RAND()*62), 1));        SET i = i+1;    END WHILE;    RETURN return_str;END // 
  1. 为了操作方便,我们再创建一个插入数据的存储过程

SQL

-- 创建插入数据的存储过程DROP PROCEDURE IF EXISTS `add_vote_record_memory` //CREATE PROCEDURE `add_vote_record_memory`(IN n INT)BEGIN    DECLARE i INT DEFAULT 1;    DECLARE vote_num INT DEFAULT 0;    DECLARE group_id INT DEFAULT 0;    DECLARE status TINYINT DEFAULT 1;    WHILE i < n DO        SET vote_num = FLOOR(1 + RAND() * 10000);        SET group_id = FLOOR(0 + RAND()*3);        SET status = FLOOR(1 + RAND()*2);        INSERT INTO `vote_record_memory` VALUES (NULL, rand_string(20), vote_num, group_id, status, NOW());        SET i = i + 1;    END WHILE;END //DELIMITER ;  -- 改回默认的 MySQL delimiter:';' 
  1. 开始执行存储过程,等待生成数据(10W条生成大约需要40分钟)

SQL

-- 调用存储过程 生成100W条数据CALL add_vote_record_memory(1000000); 
  1. 查询内存表已生成记录(为了下步测试,目前仅生成了105645条)

SQL

SELECT count(*) FROM `vote_record_memory`;-- count(*)-- 105646 
  1. 把数据从内存表插入到普通表中(10w条数据13s就插入完了)

SQL

INSERT INTO vote_record SELECT * FROM `vote_record_memory`; 
  1. 查询普通表已的生成记录

SQL

SELECT count(*) FROM `vote_record`;-- count(*)-- 105646 
  1. 如果一次性插入普通表太慢,可以分批插入,这就需要写个存储过程了:

SQL

-- 参数n是每次要插入的条数-- lastid是已导入的最大idCREATE PROCEDURE `copy_data_from_tmp`(IN n INT)BEGIN    DECLARE lastid INT DEFAULT 0;    SELECT MAX(id) INTO lastid FROM `vote_record`;    INSERT INTO `vote_record` SELECT * FROM `vote_record_memory` where id > lastid LIMIT n;END 
  1. 调用存储过程:

SQL

-- 调用存储过程 插入60w条CALL copy_data_from_tmp(600000);

SELECT * FROM vote_record;

全表查询

建完表以后开启慢查询日志,具体参考下面的例子,然后学会用explain。windows慢日志的位置在c盘,另外,使用client工具也可以记录慢日志,所以不一定要用命令行来执行测试,否则大表数据在命令行中要显示的非常久。

*1 全表扫描select from vote_record**


慢日志

SET timestamp=1529034398; select * from vote_record;

Time: 2018-06-15T03:52:58.804850Z

User@Host: root[root] @ localhost [::1]  Id:    74

Query_time: 3.166424  Lock_time: 0.000000 Rows_sent: 900500  Rows_examined: 999999

耗时3秒,我设置的门槛是一秒。所以记录了下来。

explain执行计划

id select_type table partitions type possible_keys key key_len ref rows filtered Extra

1 SIMPLE vote_record \N ALL \N \N \N \N 996507 100.00 \N

全表扫描耗时3秒多,用不到索引。

*2 select from vote_record where vote_num > 1000**

没有索引,所以相当于全表扫描,一样是3.5秒左右

*3 select from vote_record where vote_num > 1000**

加索引create 

CREATE INDEX vote ON vote_record(vote_num);

explain查看执行计划

id select_type table partitions type possible_keys key key_len ref rows filtered Extra

1 SIMPLE vote_record \N ALL votenum,vote \N \N \N 996507 50.00 Using where

还是没用到索引,因为不符合最左前缀匹配。查询需要3.5秒左右

最后修改一下sql语句

EXPLAIN SELECT * FROM vote_record WHERE id > 0 AND vote_num > 1000;

id select_type table partitions type possible_keys key key_len ref rows filtered Extra

1 SIMPLE vote_record \N range PRIMARY,votenum,vote PRIMARY 4 \N 498253 50.00 Using where

用到了索引,但是只用到了主键索引。再修改一次

EXPLAIN SELECT * FROM vote_record WHERE id > 0 AND vote_num = 1000;

id select_type table partitions type possible_keys key key_len ref rows filtered Extra

1 SIMPLE vote_record \N index_merge PRIMARY,votenum,vote votenum,PRIMARY 8,4 \N 51 100.00 Using intersect(votenum,PRIMARY); Using where

用到了两个索引,votenum,PRIMARY。

这是为什么呢。

再看一个语句

EXPLAIN SELECT * FROM vote_record WHERE id = 1000 AND vote_num > 1000

id select_type table partitions type possible_keys key key_len ref rows filtered Extra

1 SIMPLE vote_record \N const PRIMARY,votenum PRIMARY 4 const 1 100.00 \N

也只有主键用到了索引。这是因为只有最左前缀索引可以用>或<,其他索引用<或者>会导致用不到索引。

下面是几个网上参考的例子:

一:索引是sql语句优化的关键,学会使用慢日志和执行计划分析sql

背景:使用A电脑安装mysql,B电脑通过xshell方式连接,数据内容我都已经创建好,现在我已正常的进入到mysql中

步骤1:设置慢查询日志的超时时间,先查看日志存放路径查询慢日志的地址,因为有慢查询的内容,就会到这个日志中:

<pre>show global variables like "%slow%";</pre>

重新学习MySQL数据库12:从实践sql语句优化开始

2.开启慢查询日志

<pre>set global slow_query_log=on;</pre>

3.查看慢查询日志的设置时间,是否是自己需要的

<pre>show global variables like "%long%";</pre>

重新学习MySQL数据库12:从实践sql语句优化开始

4.如果不是自己想的时间,修改慢查询时间,只要超过了以下的设置时间,查询的日志就会到刚刚的日志中,我设置查询时间超过1S就进入到慢查询日志中

<pre>set global long_query_time=1;</pre>

5.大数据已准备,进行数据的查询,xshell最好开两个窗口,一个查看日志,一个执行内容

<pre>Sql查询语句:select sql_no_cache * from employees_tmp where first_name='Duangkaew' and gender='M'</pre>

重新学习MySQL数据库12:从实践sql语句优化开始

发现查数据的总时间去掉了17.74S

查看日志:打开日志

重新学习MySQL数据库12:从实践sql语句优化开始

重新学习MySQL数据库12:从实践sql语句优化开始

标记1:执行的sql语句

标记2:执行sql的时间,我的是10点52执行的

标记3:使用那台机器

标记4:执行时间,query_tims,查询数据的时间

标记5:不知道是干嘛的

标记6:执行耗时的sql语句,我在想我1的应该是截取错了!但是记住最后一定是显示耗时是因为执行什么sql造成的

6.执行打印计划,主要是查看是否使用了索引等其他内容,主要就是在sql前面加上explain 关键字

<pre>explain select sql_no_cache * from employees_tmp where first_name='Duangkaew' and gender='M';</pre>

重新学习MySQL数据库12:从实践sql语句优化开始

描述extra中,表示只使用了where条件,没有其他什么索引之类的

7.进行sql优化,建一个fist_name的索引,索引就是将你需要的数据先给筛选出来,这样就可以节省很多扫描时间

<pre>create index firstname on employees_tmp(first_name);</pre>

 重新学习MySQL数据库12:从实践sql语句优化开始

注:创建索引时会很慢,是对整个表做了一个复制功能,并进行数据的一些分类(我猜是这样,所以会很慢)

8.查看建立的索引

<pre>show index from employees_tmp;</pre>

 重新学习MySQL数据库12:从实践sql语句优化开始

9.在执行查询语句,查看语句的执行时间

<pre>select sql_no_cache * from employees_tmp where first_name='Duangkaew' and gender='M'</pre>

重新学习MySQL数据库12:从实践sql语句优化开始

   发现时间已经有所提升了,其实选择索引也不一开始就知道,我们在试试使用性别,gender进行索引

10.删除已经有的索引,删除索引:

<pre>drop index first_name on employees_tmp;</pre>

11.创建性别的索引(性别是不怎么好的索引方式,因为有很多重复数据)

<pre>create index index_gendar on employees_tmp(gender);</pre>

在执行sql语句查询数据,查看查询执行时间,没有创建比较优秀的索引,导致查询时间还变长了,

为嘛还变长了,这个我没有弄懂

重新学习MySQL数据库12:从实践sql语句优化开始

12.我们在试试使用创建组合索引,使用性别和姓名

<pre>alter table employees_tmp add index idx_union (first_name,gender);</pre>

在执行sql查看sql数据的执行时间

<pre>select sql_no_cache * from employees_tmp where first_name='Duangkaew' and gender='M'</pre>

速度提升了N多倍啊

重新学习MySQL数据库12:从实践sql语句优化开始

查看创建的索引

<pre>show index from employees_tmp;</pre>

重新学习MySQL数据库12:从实践sql语句优化开始

索引建的好真的一个好帮手,建不好就是费时的一个操作

 目前还不知道为什么建立性别的索引会这么慢

二:sql优化注意要点,比如索引是否用到,查询优化是否改变了执行计划,以及一些细节

场景

我用的数据库是mysql5.6,下面简单的介绍下场景

课程表

create table Course( c_id int PRIMARY KEY, name varchar(10) )

数据100条

学生表:

create table Student( id int PRIMARY KEY, name varchar(10) )

数据70000条

学生成绩表SC

CREATE table SC(     sc_id int PRIMARY KEY,     s_id int,     c_id int,     score int )

数据70w条

查询目的:

查找语文考100分的考生

查询语句:

select s.* from Student s where s.s_id in (select s_id from SC sc where sc.c_id = 0 and sc.score = 100 )

执行时间:30248.271s

晕,为什么这么慢,先来查看下查询计划:

EXPLAIN  select s.* from Student s where s.s_id in (select s_id from SC sc where sc.c_id = 0 and sc.score 

发现没有用到索引,type全是ALL,那么首先想到的就是建立一个索引,建立索引的字段当然是在where条件的字段。

先给sc表的c_id和score建个索引

CREATE index sc_c_id_index on SC(c_id);
CREATE index sc_score_index on SC(score);

再次执行上述查询语句,时间为: 1.054s

快了3w多倍,大大缩短了查询时间,看来索引能极大程度的提高查询效率,看来建索引很有必要,很多时候都忘记建

索引了,数据量小的的时候压根没感觉,这优化感觉挺爽。

但是1s的时间还是太长了,还能进行优化吗,仔细看执行计划:

 

查看优化后的sql:

SELECT    `YSB`.`s`.`s_id` AS `s_id`,    `YSB`.`s`.`name` AS `name`FROM    `YSB`.`Student` `s`WHERE    < in_optimizer > (        `YSB`.`s`.`s_id` ,< EXISTS > (            SELECT                1            FROM                `YSB`.`SC` `sc`            WHERE                (                    (`YSB`.`sc`.`c_id` = 0)                    AND (`YSB`.`sc`.`score` = 100)                    AND (                        < CACHE > (`YSB`.`s`.`s_id`) = `YSB`.`sc`.`s_id`                    )                )        )    )

补充:这里有网友问怎么查看优化后的语句

方法如下:

在命令窗口执行 

 

 

有type=all

按照我之前的想法,该sql的执行的顺序应该是先执行子查询

select s_id from SC sc where sc.c_id = 0 and sc.score = 100

耗时:0.001s

得到如下结果:

 

然后再执行

select s.* from Student s where s.s_id in(7,29,5000)

耗时:0.001s

这样就是相当快了啊,Mysql竟然不是先执行里层的查询,而是将sql优化成了exists子句,并出现了EPENDENT SUBQUERY,

mysql是先执行外层查询,再执行里层的查询,这样就要循环70007*11=770077次。

那么改用连接查询呢?

SELECT s.* from  Student s INNER JOIN SC sc on sc.s_id = s.s_id where sc.c_id=0 and sc.score=100

这里为了重新分析连接查询的情况,先暂时删除索引sc_c_id_index,sc_score_index

执行时间是:0.057s

效率有所提高,看看执行计划:

 

这里有连表的情况出现,我猜想是不是要给sc表的s_id建立个索引

CREATE index sc_s_id_index on SC(s_id);

show index from SC

 

在执行连接查询

时间: 1.076s,竟然时间还变长了,什么原因?查看执行计划:

 

优化后的查询语句为:

SELECT    `YSB`.`s`.`s_id` AS `s_id`,    `YSB`.`s`.`name` AS `name`FROM    `YSB`.`Student` `s`JOIN `YSB`.`SC` `sc`WHERE    (        (            `YSB`.`sc`.`s_id` = `YSB`.`s`.`s_id`        )        AND (`YSB`.`sc`.`score` = 100)        AND (`YSB`.`sc`.`c_id` = 0)    )

貌似是先做的连接查询,再执行的where过滤

回到前面的执行计划:

 

这里是先做的where过滤,再做连表,执行计划还不是固定的,那么我们先看下标准的sql执行顺序:

 

正常情况下是先join再where过滤,但是我们这里的情况,如果先join,将会有70w条数据发送join做操,因此先执行where

过滤是明智方案,现在为了排除mysql的查询优化,我自己写一条优化后的sql

SELECT    s.*FROM    (        SELECT            *        FROM            SC sc        WHERE            sc.c_id = 0        AND sc.score = 100    ) tINNER JOIN Student s ON t.s_id = s.s_id

即先执行sc表的过滤,再进行表连接,执行时间为:0.054s

和之前没有建s_id索引的时间差不多

查看执行计划:

 

先提取sc再连表,这样效率就高多了,现在的问题是提取sc的时候出现了扫描表,那么现在可以明确需要建立相关索引

CREATE index sc_c_id_index on SC(c_id);
CREATE index sc_score_index on SC(score);

再执行查询:

SELECT    s.*FROM    (        SELECT            *        FROM            SC sc        WHERE            sc.c_id = 0        AND sc.score = 100    ) tINNER JOIN Student s ON t.s_id = s.s_id

执行时间为:0.001s,这个时间相当靠谱,快了50倍

执行计划:

 

我们会看到,先提取sc,再连表,都用到了索引。

那么再来执行下sql

SELECT s.* from  Student s INNER JOIN SC sc on sc.s_id = s.s_id where sc.c_id=0 and sc.score=100

执行时间0.001s

执行计划:

 

这里是mysql进行了查询语句优化,先执行了where过滤,再执行连接操作,且都用到了索引。

总结:

1.mysql嵌套子查询效率确实比较低

2.可以将其优化成连接查询

3.建立合适的索引

4.学会分析sql执行计划,mysql会对sql进行优化,所以分析执行计划很重要

由于时间问题,这篇文章先写到这里,后续再分享其他的sql优化经历。

三、海量数据分页查找时如何使用主键索引进行优化

mysql百万级分页优化

  普通分页

   数据分页在网页中十分多见,分页一般都是limit start,offset,然后根据页码page计算start

<pre> select * from user limit 1,20</pre>

   这种分页在几十万的时候分页效率就会比较低了,MySQL需要从头开始一直往后计算,这样大大影响效率

<pre>SELECT from user limit 100001,20; //time 0.151s explain SELECT from user limit 100001,20;</pre>

  我们可以用explain分析下语句,没有用到任何索引,MySQL执行的行数是16W+,于是我们可以想用到索引去实现分页

  重新学习MySQL数据库12:从实践sql语句优化开始

   优化分页

   使用主键索引来优化数据分页

<pre> select * from user where id>(select id from user where id>=100000 limit 1) limit 20; //time 0.003s</pre>

  使用explain分析语句,MySQL这次扫描的行数是8W+,时间也大大缩短。

<pre> explain select * from user where id>(select id from user where id>=100000 limit 1) limit 20;</pre>

     重新学习MySQL数据库12:从实践sql语句优化开始

  总结

  在数据量比较大的时候,我们尽量去利用索引来优化语句。上面的优化方法如果id不是主键索引,查询效率比第一种还要低点。我们可以先使用explain来分析语句,查看语句的执行顺序和执行性能。

 

 

 

OLED 驱动模块程序代码 作为嵌入式软件开发,可能经常会使用单片机连接驱动显示屏,实现人机交互的功能,通常可选择的有 OLED 和 LCD 等,其中相关驱动代码例程网上更是数不胜数。 本文介绍的是 OLED, 常见代表有 0.96 寸的OLED,网上也有很多相关的驱动代码,但是大部分代码都是能用即可,不是特别关注驱动代码的整体架构,以下是个人整理的 OLED 驱动代码,支持配置 SPI 和 IIC 两种接口方式(目前只是测试了 SPI,IIC 有待验证)。 阅读详情

相关推荐

最终篇——SWAT模型的建立

同理,Soil Data也是同样的方法导入,在Soil Database Options的选项中,选择UserSiol,用同样的方法导入土壤类型,进行重分类。打开窗口后,只定义HRU Thresholdes,其余两个不用设置,设定各数据单元的计算率,这里的10%的意思是计算精度,即分成级HRU计算单元太小,小于平均计算单元的10%,我们就不对这HRU单元进行计算(也就是说太破碎的计算单元不进行计算),若选择0%意味着全部进行计算,需要耗费大量的内存和时间,对计算机要求较高,不建议。

m0_72556434的博客 5620

mysql 单表字段多少合适_公司DBA关于MySQL开发的一点经验

尽量不要让数据库做过多运算数据库主要是用来存储的,我们应避免让数据库做运算,比如写定时任务,存储过程等。复杂的计算应该在程序代码中实现。我们应该尽量简单的使用数据库。控制数据量一年内单表数据量一般含char不超过500W条,我们需要合理的分表。单个库的表建议在300到400之间。单表字段数量单表的字段应该少而精,那多少合适呢?一般单表字段上限控制在20到50个。在开发中,我们要注意避免使用大SQL...

weixin_39884738的博客 8080

点云图的学习

一。点云地图拼接 1.1 配置运行环境 首先配置安装opencv3,安装完成后如下图: 然后配置点云图工具pcl,直接使用apt即可安装,安装后如下图: 最后使用点云工具观察点云图: 1.2 原理解析 总的来说由多角度拍摄图片拼接为点云3D图,是通过相机的内参,将像素坐标转化为相机坐标,再通过外参将相机坐标转化为世界坐标系,然后将每张图片的像素绘制填充于同一个世界坐标系下面,形成点云3D图。...

ff_xun的博客 1万+

mysql 分段执行_面试之项目中常用的19条MySQL优化技巧

声明一下:下面的优化方案都是基于 “ Mysql-索引-BTree类型 ”。 一 善用EXPLAIN做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据•type列: 连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别•key列: 使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方...

weixin_33586063的博客 101

抖音小游戏(IAA)巨量引擎投放指南

摘要:本文详细介绍了在巨量引擎平台投放小游戏广告的完整流程,包括五个关键步骤:1)添加小游戏资产,填写ID等信息并等待审核;2)添加事件管理,配置激活和关键行为事件;3)通过橙子建站创建落地页,设置跳转链接;4)新建广告项目,选择小程序推广目标;5)完成广告创建。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 4485

中科蓝讯(第一次使用指南)

中科蓝讯 新手指南

qq_48579018的博客 1万+

sql拆分字符串 生成多条记录_重新学习MySQL数据库12:从实践sql语句优化开始

本文转自互联网 本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: http://www.how2playlife.com 本文是微信公众号【Java技术江湖】的《重新学习MySQL数据库》...

weixin_39923623的博客 345

SQL的基本介绍

1.什么是数据库?2.什么是数据库管理系统?3.什么是 SQL?1.数据库是保存有组织的数据的容器,通常是一个文件或一组文件,可以将其看作电子化的文件柜。用户可以对文件中的数据执行新增、删除、更新、查询等操作。2.数据库管理系统是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户可以通过 DBMS 访问数据库中的数据,数据库管理员也可以通过 DBMS 进行数据库的维护工作。

shiwei0813的博客 2879

一个系列搞懂Mysql数据库12:从实践sql语句优化开始

Table of Contents 字段 索引 查询SQL 引擎 MyISAM InnoDB 0、自己写的海量数据sql优化实践 mysql百万级分页优化   普通分页    优化分页   总结 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量: 字段 尽量使用TINYINT

Viper的程序员修炼手册 1837

Sigrity OptimizePI IC Device Power Pin Inductance Analysis模式如何计算IC电源管脚电感操作指导

Sigrity OptimizePI IC Device Power Pin Inductance Analysis模式可以计算电容到IC电源管脚的电感,用于评估电容位置对于IC电源管脚的效果,如何分析,以下图为例进行说明。Capacitors:选择层面,这里选择top layer(IC在top层),下方可以选择电容的size,这里选择All Size。IC devices,输入U*, A*, B*, Q*, P*,将所有这些字母开头的器件都识别为IC。模式如何计算IC电源管脚电感操作指导。

weixin_54787054的博客 408

深入理解 HTTP 协议中的 Content-Type

是 HTTP 协议中的一个头部字段(Header),用于指示请求或响应中实体主体(body)的媒体类型(Media Type),也称为MIME 类型(Multipurpose Internet Mail Extensions)。

h a 6 6 6 c k 为 你解决复杂难题! 997

MySQL 简介及SQL 语句

MySQL 整体架构: 1.连接池:负责和客户端进行连接,连接池可以同时处理多个数据库请求。同时还有 SSL 的安全概念,可以确保连接是安全的。 2.SQL 接口:当 SQL 语句进入 MySQL 后,会先到 SQL 接口中,将传过来的 SQL 语句拆散,将底层的结果封装成 SQL 的数据格式。 3.解析器:负责将 SQL 语句进行拆分,如果语句有问题那么就返回错误,如果没问题就继续向下执行。 4.优化器:对 SQL 查询的结果优化处理,产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返回结果。

愿许浪尽天涯的博客 5529

软考高级系统架构设计师历年论文真题深度分析(2011-2025)

本文系统分析了2011-2025年系统架构设计师论文真题,归纳出十大主题类别,包括架构风格、企业集成、数据技术、非功能属性等。研究发现新兴技术占比最高(18.8%),企业集成、数据架构和非功能属性为三大核心考点。论文命题呈现明显技术演进特征,从经典架构理论逐步转向云原生、AI融合等前沿方向。备考建议重点关注高频考点和技术前沿,同时强化场景化解决方案能力。分析表明,架构师考试持续跟踪行业技术发展,注重理论与实践结合,为考生提供了明确的备考方向。

一几文的编程学习笔记。 2033

MySQL 数据库 SQL 语句全面解析与实战总结

在《MySQL 数据库技术》课程中,SQL 语句是核心知识体系。本文从语法规范、应用场景、易错点及实战案例四个维度,对 MySQL 常用 SQL 语句进行系统性整理,结合官方文档(参考 MySQL 8.0 官方文档 )和实战经验,帮助读者构建完整的 SQL 知识框架。目录前言一、数据定义语言(DDL)1. CREATE 语句​2. ALTER 语句​二、数据操作语言(DML)1.INSERT 语句2.UPDATE 语句三、数据查询语言(DQL)1. SELECT 语句2. 聚合函数。

2501_91809383的博客 2196

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

DB Query Analyzer 中断SQL语句的执行

DB Query Analyzer 中断SQL语句的执行                                                马根峰                     ( 广东联合电子收费股份有限公司, 广州 510300) 摘要:     万能数据库查询分析器有两个版本:DB 查询分析器(中文版本)和 DB Query Analyzer(英文版本)。它不仅能

《万能数据库查询分析器》创作人 2655

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MySQL 数据库 SQL 语句全面总结

使用规范:用于创建数据库、表、视图、索引等数据库对象。应用规则:创建表时需明确各列的数据类型,如INT(整数)、VARCHAR(可变长度字符串)、DATE(日期)等 ,并合理设置主键、外键等约束。易错点:数据类型选择不当可能导致存储异常;定义主键时若未确保唯一性和非空性,会引发错误。实例演示-- 创建名为test_db的数据库-- 在test_db数据库中创建students表age INT通过对各类 SQL 语句的整理,我们对 MySQL 数据库操作有了更系统的认识。

qbgtqb的博客 1273

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MySQL 数据库技术:SQL 语句全梳理与实践总结

CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARACTER SET 字符集];避免重复创建报错;指定字符集(如utf8mb4)适配业务需求,存储 emoji 等特殊字符需用utf8mb4。CREATE TABLE [IF NOT EXISTS] 表名 ( 字段1 数据类型 [约束], 字段2 数据类型 [约束], ... [表级约束] );字段定义需明确数据类型(INTVARCHAR等 )和约束(NOT NULLUNIQUE等 );

AAqzh的博客 1493

[MySQL]SQL优化之sql语句优化

SQL查询优化在MySQL数据库中是提高性能的关键步骤之一。本文总结了一系列针对SQL查询的优化技巧,以帮助开发者改善查询性能,降低系统负载。

Panci_的博客 1491

【SQL】Mysql中一条sql语句的执行过程

假设写完 redo log 后,机器挂了,binlog 日志没有被写入,那么机器重启后,这台机器会通过 redo log 恢复数据,但是这个时候 binlog 并没有记录该数据,后续进行机器备份的时候,就会丢失这一条数据,同时主从同步也会丢失这一条数据。然后拿到查询的语句,把 age 改为 19,然后调用引擎 API 接口,写入这一行数据,InnoDB 引擎把数据保存在内存中,同时记录 redo log,此时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,随时可以提交。

double222222的博客 3442

数据库与表的诞生:MySQL中CREATE DATABASE和CREATE TABLE语句详解

在MySQL中,表是存储数据的核心单元,而语句则是构建这些数据容器的基础工具。通过该语句,我们可以定义表的结构,包括列名、数据类型、约束条件以及存储引擎等关键组成部分。掌握语句的语法和设计原则,是进行高效数据管理的第一步。列定义是表结构的核心,每一列都需要明确指定数据类型,以确保数据的准确存储和高效查询。数值类型:如INT用于整数,DECIMAL用于精确小数。字符串类型:如VARCHAR(n)用于可变长度字符串(n为最大字符数),TEXT用于长文本。日期时间类型:如DATETIME存储日期和时间,

zuiyuelong的博客 1461

Sql(sql语句优化,索引设计优化)

Sql(sql语句优化,索引设计优化)

轻言细语莫泪痕 1954

SQL 数据库监控:SQL语句监控工具与实践案例

监控最佳实践 建立基线:了解系统正常状态下的性能指标 设置警报:对关键指标设置阈值警报 定期审查:定期分析监控数据,发现潜在问题 关联分析:将SQL性能与系统资源使用关联分析 长期存储:保留历史数据用于趋势分析和容量规划 通过以上方法和工具,可以有效地监控SQL语句执行情况,及时发现并解决性能问题。

weixin_46261399的博客 1606

MySQL优化:12种提升SQL执行效率的有效方法

以上提到的优化方法只是众多MySQL优化技术中的一小部分。在实际应用中,应根据具体的数据模式和查询需求灵活选择最合适的优化策略。数据库优化是一个持续的过程,定期的性能评估和调优是保持数据库高效运行的关键。通过实践这些优化技巧,你可以显著提升数据库的性能和响应速度。本文,已收录于,我的技术网站ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享。

旺旺小崔崔的博客 1461

Mysql:SQL优化的艺术与实践

在我的开发经历中,曾遇到一个性能瓶颈问题,涉及一个复杂的报表查询,其中包括多个表的JOIN操作和复杂的过滤条件。通过本文的学习,希望你能掌握SQL优化的基本原则和高级技巧,在实际工作中不断提高数据库系统的性能和稳定性。记住,优秀的SQL语句不仅关乎速度,更关乎优雅与智慧,愿你在SQL优化的道路上越走越远,成为真正的数据库专家。本文旨在深入探讨SQL优化的过程,涵盖从基本概念到实战技巧的全面内容,辅以丰富的代码示例和经验分享,帮助开发者掌握SQL优化的核心技能。了解SQL语句的执行计划是优化的基础。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1207

MySQL性能优化(一)MySQL中SQL语句是如何执行的?

认识SQL语句如何在数据库中进行执行

歪桃的博客 1万+
上一篇: 重新学习MySQL数据库11:以Java的视角来聊聊SQL注入
下一篇: 重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值