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

网站建设怎么建好中国外包公司

网站建设怎么建好,中国外包公司,重庆消防网,指数平台Mysql——索引 索引优缺点:索引结构索引分类聚集索引选取规则:语法使用规则索引失效情况覆盖索引 SQL 优化order by优化group by优化 索引 索引是帮助 MySQL 高效获取数据的一种数据结构。 优缺点: 优点: 提高数据检索效率&…

Mysql——索引

    • 索引
      • 优缺点:
      • 索引结构
      • 索引分类
        • 聚集索引选取规则:
        • 语法
        • 使用规则
        • 索引失效情况
        • 覆盖索引
      • SQL 优化
        • order by优化
        • group by优化

索引

索引是帮助 MySQL 高效获取数据的一种数据结构。

优缺点:

  • 优点:
    提高数据检索效率,降低数据库的IO成本
    通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗
  • 缺点:
    索引列也是要占用空间的
    索引大大提高了查询效率,但降低了更新的速度,比如 INSERT、UPDATE、DELETE

索引结构

MySQL 索引数据结构对经典的 B+Tree 进行了优化。在原来 B-Tree 的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的 B+Tree,提高区间访问的性能。
在这里插入图片描述

演示地址

索引分类

分类含义特点关键字
主键索引针对于表中主键创建的索引 默认自动创建,只能有一个PRIMARY
唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE
常规索引快速定位特定数据可以有多个
全文索引全文索引查找的是文本中的关键词,而不是比较索引中的值可以有多个FULLTEXT

在 InnoDB 存储引擎中,根据索引的存储形式,又可以分为以下两种:

分类含义特点
聚集索引(Clustered Index)将数据存储与索引放一块,索引结构的叶子节点保存了行数据必须有,而且只有一个(叶子节点存储整行的数据)
二级索引(Secondary Index)将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键可以存在多个(叶子节点存储id)
聚集索引选取规则:

如果存在主键,主键索引就是聚集索引
如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引
如果表没有主键或没有合适的唯一索引,则 InnoDB 会自动生成一个 rowid 作为隐藏的聚集索引

语法
创建索引:
CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (index_col_name, ...);
如果不加 CREATE 后面不加索引类型参数,则创建的是常规索引查看索引:
SHOW INDEX FROM table_name;删除索引:
DROP INDEX index_name ON table_name;

案例:

-- name字段为姓名字段,该字段的值可能会重复,为该字段创建索引
create index idx_user_name on tb_user(name);
-- phone手机号字段的值非空,且唯一,为该字段创建唯一索引
create unique index idx_user_phone on tb_user (phone);
-- 为profession, age, status创建联合索引
create index idx_user_pro_age_stat on tb_user(profession, age, status);
-- 为email建立合适的索引来提升查询效率
create index idx_user_email on tb_user(email);-- 删除索引
drop index idx_user_email on tb_user;
使用规则
  • 最左前缀法则

如果索引关联了多列(联合索引),要遵守最左前缀法则,最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。

create index idx_stu_age_sex_country on stu (country,age,sex);EXPLAIN SELECT * FROM stu WHERE country = 'China' AND age = 14 AND sex = 'Male'

如果跳跃某一列,索引将部分失效(后面的字段索引失效)。

联合索引中,出现范围查询(<, >),范围查询右侧的列索引失效。可以用>=或者<=来规避索引失效问题。

create index idx_stu_name_age_phone on stu (name,age,phone);
EXPLAIN SELECT * FROM stu WHERE name = 'Student16' AND age >= 16 AND phone = '12328557947'
create index idx_stu_age_sex_country on stu (country,age,sex);EXPLAIN SELECT * FROM stu WHERE country = 'China' AND age = 14 AND sex = 'Male'
索引失效情况
  • 在索引列上进行运算操作,索引将失效。如:
explain select * from stu where substring(phone, 10, 2) = '15';
  • 字符串类型字段使用时,不加引号,索引将失效。如:
explain select * from stu where phone = 17799990015;
  • 模糊查询中,如果仅仅是尾部模糊匹配,索引不会是失效;
  • 前后都有 % 也会失效。
  • 如果是头部模糊匹配,索引失效。如:
explain select * from stu where phone like '%16754'
  • 用 or 分割开的条件,如果 or 其中一个条件的列没有索引,那么涉及的索引都不会被用到。
explain select * from stu where phone = '11955716754' or name = 'Student35' OR id_card_num = '313703455'

如果 MySQL 评估使用索引比全表更慢,则不使用索引。

覆盖索引

如果在聚集索引中直接能找到对应的行,则直接返回行数据,只需要一次查询,哪怕是select *;如果在辅助索引中找聚集索引,如select id, name from xxx where name=‘xxx’;,也只需要通过辅助索引(name)查找到对应的id,返回name和name索引对应的id即可,只需要一次查询;如果是通过辅助索引查找其他字段,则需要回表查询,如
select id, name, gender from xxx where name=‘xxx’;

所以尽量不要用select *,容易出现回表查询,降低效率,除非有联合索引包含了所有字段

SQL 优化

order by优化
  1. Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区 sort buffer 中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序
  2. Using index:通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index,不需要额外排序,操作效率高

如果order by字段全部使用升序排序或者降序排序,则都会走索引,但是如果一个字段升序排序,另一个字段降序排序,则不会走索引,explain的extra信息显示的是Using index, Using filesort,如果要优化掉Using filesort,则需要另外再创建一个索引,如:

create index idx_stu_age_phone on stu(age , phone );EXPLAIN SELECT age,phone FROM stu ORDER BY age ASC,phone DESC
create index idx_stu_age_phone on stu(age ASC, phone DESC);

此时使用select id, age, phone from tb_user order by age asc, phone desc;会全部走索引

总结:

  • 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则
  • 尽量使用覆盖索引
  • 多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)
group by优化
  • 在分组操作时,可以通过索引来提高效率
SELECT address,count(1) FROM stu GROUP BY address
  • 分组操作时,索引的使用也是满足最左前缀法则的
EXPLAIN SELECT address,count(1),school FROM stu GROUP BY address,school

#### update优化(避免行锁升级为表锁)InnoDB 的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁。如以下两条语句:```sql
//这句由于id有主键索引,所以只会锁这一行;
update user set no = '123' where id = 7;
//这句由于name没有索引,所以会把整张表都锁住进行数据更新,解决方法是给name字段添加索引
update student set no = '123' where name = 'test';
http://www.dtcms.com/a/426143.html

相关文章:

  • 网站开发 博客平面设计素材免费下载
  • 做旅游宣传网站的流程云南建设厅建筑业管理网站
  • 电子商务与网站建设的报告做推广哪家网站好
  • 自己做的商业网站在那里发布如何自建淘宝客网站
  • 开封建设网站网站运营专员做六休一
  • 六安网站制作多少钱网站建设市场价格
  • 做电商有那个网站网站网站做员工犯法吗
  • 廊坊网站制作生物网站 template
  • 河北制作网站模板建站公司喂来苏州网络科技有限公司
  • 东莞营销网站建设服务如何建立互联网公司网站
  • 上海专业的网站建设公司排名绵阳住房和城乡建设厅官方网站
  • 陕西省安康市建设局网站赶集网招聘
  • 网站开发公司怎么接单南阳网站建设培训班
  • 潍坊网站优化公司网站虚拟主机有什么用
  • 北京婚恋网站哪家最好索尼电视网页浏览器
  • 芜湖做网站的邓健照片做网站技术方法有
  • 石家庄做网站电话做试试彩网站
  • 怎么做个人网站软件app免费下载大全
  • 嘉兴网站建设咨询广州建设信息网官网
  • 一个域名怎么用来做多个网站南京网站搭建
  • 谷歌paypal官网下载网站关键词排名优化软件
  • 专业网站设计开发wordpress备份文件后缀
  • 为何要网站优化百度seo引流怎么做
  • 清河做网站哪里好东莞网页设计培训班
  • 广州网站建设的地方推荐高新网站开发建设多少钱
  • 聊天网站模板网站建设的方案图片
  • 网站建设成本 网站空间站长工具seo
  • wordpress站点地图无法读取网站备案企业用个人来备案可以用吗
  • 网站模版安装教程网站建设提供商
  • 网站建设维护实训总结莱芜区组织部网站