当前位置: 首页 > news >正文

微网站模板源代码网络营销的优势与不足

微网站模板源代码,网络营销的优势与不足,专业微网站电话号码,软件开发难度大吗1.插入数据 1.1insert 如果我们需要一次性往数据库表中插入多条记录#xff0c;可以从以下三个方面进行优化。 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into tb_test values(3,jerry); 1). 优化方案一 批量插入数据 Insert into t…1.插入数据 1.1insert 如果我们需要一次性往数据库表中插入多条记录可以从以下三个方面进行优化。 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into tb_test values(3,jerry); 1). 优化方案一 批量插入数据 Insert into tb_test values(1,Tom),(2,Cat),(3,Jerry); 2). 优化方案二 手动控制事务 start transaction; insert into tb_test values(1,Tom),(2,Cat),(3,Jerry); insert into tb_test values(4,Tom),(5,Cat),(6,Jerry); insert into tb_test values(7,Tom),(8,Cat),(9,Jerry); commit; 3). 优化方案三 主键顺序插入性能要高于乱序插入。 主键乱序插入 : 8 1 9 21 88 2 4 15 89 5 7 3 主键顺序插入 : 1 2 3 4 5 7 8 9 15 21 88 89 1.2大批量插入数据 如果一次性需要插入大批量数据 ( 比如 : 几百万的记录 ) 使用 insert 语句插入性能较低此时可以使 用 MySQL 数据库提供的 load 指令进行插入。操作如下 可以执行如下指令将数据脚本文件中的数据加载到表结构中 -- 客户端连接服务端时加上参数 -–local-infile mysql –-local-infile -u root -p -- 设置全局参数local_infile为1开启从本地加载文件导入数据的开关 set global local_infile 1; -- 执行load指令将准备好的数据加载到表结构中 load data local infile /root/sql1.log into table tb_user fields terminated by , lines terminated by \n ; 主键顺序插入性能高于乱序插入 示例演示 : A. 创建表结构 CREATE TABLE tb_user ( id INT(11) NOT NULL AUTO_INCREMENT, username VARCHAR(50) NOT NULL, password VARCHAR(50) NOT NULL, name VARCHAR(20) NOT NULL, birthday DATE DEFAULT NULL, sex CHAR(1) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY unique_user_username (username) ) ENGINEINNODB DEFAULT CHARSETutf8 ; B. 设置参数 -- 客户端连接服务端时加上参数 -–local-infile mysql –-local-infile -u root -p -- 设置全局参数local_infile为1开启从本地加载文件导入数据的开关 set global local_infile 1; C. load 加载数据 load data local infile /root/load_user_100w_sort.sql into table tb_user fields terminated by , lines terminated by \n ; 我们看到插入 100w 的记录 17s 就完成了性能很好。 在 load 时主键顺序插入性能高于乱序插入 2.主键优化 在上一小节我们提到主键顺序插入的性能是要高于乱序插入的。 这一小节就来介绍一下具 体的原因然后再分析一下主键又该如何设计。 1). 数据组织方式 在 InnoDB 存储引擎中表数据都是根据主键顺序组织存放的这种存储方式的表称为索引组织表 (index organized table IOT) 。 行数据都是存储在聚集索引的叶子节点上的。而我们之前也讲解过 InnoDB 的逻辑结构图 在 InnoDB 引擎中数据行是记录在逻辑结构 page 页中的而每一个页的大小是固定的默认 16K 。 那也就意味着 一个页中所存储的行也是有限的如果插入的数据行 row 在该页存储不小将会存 储到下一个页中页与页之间会通过指针连接。 2). 页分裂 页可以为空也可以填充一半也可以填充 100% 。每个页包含了 2-N 行数据 ( 如果一行数据过大 会行溢出) 根据主键排列。 A. 主键顺序插入效果 ① . 从磁盘中申请页 主键顺序插入 ② . 第一个页没有满继续往第一页插入 ③ . 当第一个也写满之后再写入第二个页页与页之间会通过指针连接 ④ . 当第二页写满了再往第三页写入 B. 主键乱序插入效果 ① . 加入 1#,2# 页都已经写满了存放了如图所示的数据 ② . 此时再插入 id 为 50 的记录我们来看看会发生什么现象 会再次开启一个页写入新的页中吗 不会。因为索引结构的叶子节点是有顺序的。按照顺序应该存储在 47 之后。 但是 47 所在的 1# 页已经写满了存储不了 50 对应的数据了。 那么此时会开辟一个新的页 3# 。 但是并不会直接将 50 存入 3# 页而是会将 1# 页后一半的数据移动到 3# 页然后在 3# 页插入 50 。 移动数据并插入 id 为 50 的数据之后那么此时这三个页之间的数据顺序是有问题的。 1# 的下 一个页应该是3# 3# 的下一个页是 2# 。 所以此时需要重新设置链表指针。 上述的这种现象称之为 页分裂 是比较耗费性能的操作。 3). 页合并 目前表中已有数据的索引结构 ( 叶子节点 ) 如下 当我们对已有数据进行删除时具体的效果如下 : 当删除一行记录时实际上记录并没有被物理删除只是记录被标记 flaged 为删除并且它的空 间变得允许被其他记录声明使用。 当我们继续删除2#的数据记录 当页中删除的记录达到 MERGE_THRESHOLD 默认为页的 50% InnoDB 会开始寻找最靠近的 页前或后看看是否可以将两个页合并以优化空间使用。 删除数据并将页合并之后再次插入新的数据21则直接插入3#页 这个里面所发生的合并页的这个现象就称之为 页合并。 知识小贴士 MERGE_THRESHOLD 合并页的阈值可以自己设置在创建表或者创建索引时指定。 4). 索引设计原则 满足业务需求的情况下尽量降低主键的长度。 插入数据时尽量选择顺序插入选择使用 AUTO_INCREMENT 自增主键。 尽量不要使用 UUID 做 主键或者是其他自然主键如身份证号。 业务操作时避免对主键的修改。 3.order by优化 MySQL 的排序有两种方式 Using filesort : 通过表的索引或全表扫描读取满足条件的数据行然后在排序缓冲区 sort buffer 中完成排序操作所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。 Using index : 通过有序索引顺序扫描直接返回有序数据这种情况即为 using index 不需要 额外排序操作效率高。 对于以上的两种排序方式 Using index 的性能高而 Using filesort 的性能低我们在优化排序 操作时尽量要优化为 Using index 。 接下来我们来做一个测试 A. 数据准备 把之前测试时为 tb_user 表所建立的部分索引直接删除掉 drop index idx_user_phone on tb_user; drop index idx_user_phone_name on tb_user; drop index idx_user_name on tb_user; B. 执行排序SQL explain select id,age,phone from tb_user order by age ; explain select id,age,phone from tb_user order by age, phone ; 由于 age, phone 都没有索引所以此时再排序时出现 Using filesort 排序性能较低。 C. 创建索引 -- 创建索引 create index idx_user_age_phone_aa on tb_user(age,phone); D. 创建索引后根据 age, phone 进行升序排序 explain select id,age,phone from tb_user order by age; 1 explain select id,age,phone from tb_user order by age , phone; 1 建立索引之后再次进行排序查询就由原来的 Using filesort 变为了 Using index 性能 就是比较高的了。 E. 创建索引后根据 age, phone 进行降序排序 explain select id,age,phone from tb_user order by age desc , phone desc ; 也出现 Using index 但是此时 Extra 中出现了 Backward index scan 这个代表反向扫描索 引因为在 MySQL 中我们创建的索引默认索引的叶子节点是从小到大排序的而此时我们查询 排序时是从大到小所以在扫描时就是反向扫描就会出现 Backward index scan 。 在 MySQL8 版本中支持降序索引我们也可以创建降序索引。 F. 根据 phone age 进行升序排序 phone 在前 age 在后。 explain select id,age,phone from tb_user order by phone , age; 排序时 , 也需要满足最左前缀法则 , 否则也会出现 filesort 。因为在创建索引的时候 age 是第一个 字段 phone 是第二个字段所以排序时也就该按照这个顺序来否则就会出现 Using filesort。 F. 根据 age, phone 进行降序一个升序一个降序 explain select id,age,phone from tb_user order by age asc , phone desc ; 因为创建索引时如果未指定顺序默认都是按照升序排序的而查询时一个升序一个降序 此时就会出现Using filesort 。 为了解决上述的问题我们可以创建一个索引这个联合索引中 age 升序排序 phone 倒序排 序。 G. 创建联合索引 (age 升序排序 phone 倒序排序 ) create index idx_user_age_phone_ad on tb_user(age asc ,phone desc); H. 然后再次执行如下SQL explain select id,age,phone from tb_user order by age asc , phone desc ; 升序/降序联合索引结构图示: 由上述的测试 , 我们得出 order by 优化原则 : A. 根据排序字段建立合适的索引多字段排序时也遵循最左前缀法则。 B. 尽量使用覆盖索引。 C. 多字段排序 , 一个升序一个降序此时需要注意联合索引在创建时的规则 ASC/DESC 。 D. 如果不可避免的出现 filesort 大数据量排序时可以适当增大排序缓冲区大小 sort_buffer_size( 默认 256k) 。 4.group by优化 分组操作我们主要来看看索引对于分组操作的影响。 首先我们先将 tb_user 表的索引全部删除掉 。 drop index idx_user_pro_age_sta on tb_user; drop index idx_email_5 on tb_user; drop index idx_user_age_phone_aa on tb_user; drop index idx_user_age_phone_ad on tb_user; 接下来在没有索引的情况下执行如下 SQL 查询执行计划 explain select profession , count(*) from tb_user group by profession ; 然后我们在针对于 profession age status 创建一个联合索引。 create index idx_user_pro_age_sta on tb_user(profession , age , status); 紧接着再执行前面相同的 SQL 查看执行计划。 explain select profession , count(*) from tb_user group by profession ; 再执行如下的分组查询 SQL 查看执行计划 我们发现如果仅仅根据 age 分组就会出现 Using temporary 而如果是 根据 profession,age 两个字段同时分组则不会出现 Using temporary 。原因是因为对于分组操作 在联合索引中也是符合最左前缀法则的。 所以在分组操作中我们需要通过以下两点进行优化以提升性能 A. 在分组操作时可以通过索引来提高效率。 B. 分组操作时索引的使用也是满足最左前缀法则的。 5.limit优化 在数据量比较大时如果进行 limit 分页查询在查询时越往后分页查询效率越低。 我们一起来看看执行limit 分页查询耗时对比 通过测试我们会看到越往后分页查询效率越低这就是分页查询的问题所在。 因为当在进行分页查询时如果执行 limit 2000000,10 此时需要 MySQL 排序前 2000010 记 录仅仅返回 2000000 - 2000010 的记录其他记录丢弃查询排序的代价非常大 。 优化思路 : 一般分页查询时通过创建 覆盖索引 能够比较好地提高性能可以通过覆盖索引加子查 询形式进行优化。 explain select * from tb_sku t , (select id from tb_sku order by id limit 2000000,10) a where t.id a.id; 6.count优化 6.1概述 select count(*) from tb_user ; 在之前的测试中我们发现如果数据量很大在执行 count 操作时是非常耗时的。 MyISAM 引擎把一个表的总行数存在了磁盘上因此执行 count(*) 的时候会直接返回这个 数效率很高 但是如果是带条件的 count MyISAM 也慢。 InnoDB 引擎就麻烦了它执行 count(*) 的时候需要把数据一行一行地从引擎里面读出 来然后累积计数。 如果说要大幅度提升 InnoDB 表的 count 效率主要的优化思路自己计数 ( 可以借助于 redis 这样的 数据库进行, 但是如果是带条件的 count 又比较麻烦了 ) 。 6.2count用法 count() 是一个聚合函数对于返回的结果集一行行地判断如果 count 函数的参数不是 NULL 累计值就加 1 否则不加最后返回累计值。 用法 count * 、 count 主键、 count 字段、 count 数字 按照效率排序的话 count( 字段 ) count( 主键 id) count(1) ≈ count(*) 所以尽 量使用 count(*) 。 7.update优化 我们主要需要注意一下 update 语句执行时的注意事项。 update course set name javaEE where id 1 ; 1 当我们在执行删除的 SQL 语句时会锁定 id 为 1 这一行的数据然后事务提交之后行锁释放。 但是当我们在执行如下 SQL 时。 update course set name SpringBoot where name PHP ; 当我们开启多个事务在执行上述的 SQL 时我们发现行锁升级为了表锁。 导致该 update 语句的 性能大大降低 InnoDB 的行锁是针对索引加的锁不是针对记录加的锁 , 并且该索引不能失效否则会从行锁升级为表锁 。
http://www.w-s-a.com/news/215870/

相关文章:

  • 网站建设与分工的论文足球世界排名
  • 网站首页添加标签如何用模板建站
  • 官方网站包括哪几个网站泰安的网站建设公司哪家好
  • 域名虚拟服务器做网站如何搭建企业网站
  • 用手机做网站服务器口碑好的常州网站建设
  • 摄影网站的设计与实现开题报告太原企业自助建站
  • 做如美团式网站要多少钱做网站怎么去文化局备案
  • 桂平市住房和城乡建设局网站网站建设与管理自考题
  • 怎么做公司网站制作凡科官方网
  • 达人设计网官方网站建筑效果图网站有哪些
  • 网站定制哪家快建筑室内设计网
  • 网站创建方案论文旅游网站的设计与制作html
  • 网站建设的数据导入导出开发小程序需要多少钱费用
  • 局网站建设进入前十名wordpress user role editor
  • 网站托管如何收费搜一下百度
  • 中国建设劳动协会网站wordpress 区块链媒体
  • 网站开源是什么意思西安做网站科技有限公司
  • 自己怎么用h5做网站肇庆seo
  • 长沙网站seo优化公司东莞企业官方网站建设
  • 网站个人备案材料北京网站推广价格
  • 百度做任务的网站电子工程网网站
  • 中介订制网站开发玉溪网站建设设计
  • 免费网站免费无遮挡手机页面设计软件
  • 网站建设需求规格说明书中山模板建站公司
  • wordpress get值网站建设 seo sem
  • 网站建设微信开发工厂代加工平台
  • 厦门 网站建设 公司哪家好asp.net 创建网站
  • 专业北京网站建设凡科网做网站怎么样
  • 金富通青岛建设工程有限公司网站浙江省住建厅四库一平台
  • 有搜索引擎作弊的网站企业建设H5响应式网站的5大好处6