前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Floating Action Button-Android M新控件

Floating Action Button-Android M新控件

作者头像
小小工匠
发布于 2021-08-16 02:19:05
发布于 2021-08-16 02:19:05
1.5K00
代码可运行
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构
运行总次数:0
代码可运行

概述

浮动操作按钮是Material Design 中推出的控件之一

浮动操作按钮 (简称 FAB) 是: “一个特殊的promoted操作案例。因为一个浮动在UI之上的圆形图标而显得格外突出,同时它还具有特殊的手势行为”

比如,如果我们在使用email app,在列出收件箱邮件列表的时候,promoted操作可能就是新建一封邮件。

浮动操作按钮代表一个屏幕之内最基本的额操作。关于FAB按钮的更多信息和使用案例请参考谷歌的官方设计规范

运行效果


用法

谷歌在2015年的 I/O大会上公布了可以创建浮动操作按钮的支持库,但是在这之前,则须使用诸如makovkastar/FloatingActionButtonfuturesimple/android-floating-action-button 这样的第三方库。

Floating Action Icons

The floating action button uses the same menu icons used for the App Bar at the top of the screen. This means the image should be single color and fit the material design guidelines. The best source for these icons is the material design icons site or the official google material icons:

Once you’ve selected the icon to use, download the image by selecting the icon and then “Icon Package” and choose the “Android” package. Note that Mac users may need to use the Unarchiver to properly unzip the icon package. Bring the various drawables into the drawable folders within your Android app.

Design Support Library

效果图

操作步骤

首先确保你按照Design Support Library中的指导来配置。

现在你可以把android.support.design.widget.FloatingActionButton添加到布局中了。其中src属性指的是浮动按钮所要的图标。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 .support.design.widget.FloatingActionButton
        android:src="@drawable/ic_done"
        app:fabSize="normal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

另外,如果在布局的最顶部声明了xmlns:app=”http://schemas.android.com/apk/res-auto命名空间,你还可以定义一个fabSize属性,该属性决定按钮是 normal or mini.

放置浮动操作按钮需要使用CoordinatorLayout。CoordinatorLayout帮助我们协调它所包含的子view之间的交互,这一点在我们后面讲如何根据滚动的变化让按钮动画隐藏与显示的时候有用。但是目前我们能从CoordinatorLayout得到的好处是它可以让一个元素浮动在另一个元素之上。我们只需让FloatingActionButton和ListView被包含在CoordinatorLayout中,然后使用layout_anchor 与 layout_anchorGravity 属性就可以了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.support.design.widget.CoordinatorLayout
    android:id="@+id/main_content"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

          "@+id/lvToDoList"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

          .support.design.widget.FloatingActionButton
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="bottom|right"
              android:layout_margin="16dp"
              android:src="@drawable/ic_done"
              app:layout_anchor="@id/lvToDoList"
              app:layout_anchorGravity="bottom|right|end" />
.support.design.widget.CoordinatorLayout>

按钮应该处于屏幕的右下角。建议在手机上下方的margin设置为16dp而平板上设置为24dp。上面的例子中,使用的是16dp。

而根据谷歌的设计规范,drawable的尺寸应该是24dp。

实际上只需要指定一个布局文件,就可以看到效果了,只不过是这时候的FAB是固定在屏幕指定位置的,而无法随之滚动,不着急,下面会介绍如何设置成可滚动的FAB

属性介绍

  • FAB 默认使用应用主题中设置的浮起色作为按键背景。你可以使用 app:backgroundTint 属性,或者调用 setBackgroundTintList (ColorStateList tint) 方法改变 FAB 背景色;
  • 如上文中提到的,可以使用 app:fabSize 属性选择普通大小或者迷你大小;
  • 使用 android:src 改变 FAB 对应的 drawable;
  • 使用 app:rippleColor 设置 FAB 按下时的波纹效果;
  • 使用 app:borderWidth 设置 FAB 边框宽度;
  • 使用 app:elevation 设置闲置状态下 FAB 的景深(默认是 6dp);
  • 使用 app:pressedTranslationZ 设置 FAB 按下时的景深(默认是 12dp)。

浮动操作按钮的动画

官方效果图

操作步骤

要让这个过程有动画效果,你需要利用好CoordinatorLayout,CoordinatorLayout帮助协调定义在里面的view之间的动画。

用RecyclerView替换ListViews

目前,你需要用RecyclerView来替换ListView。就如这节所描述的,RecyclerView是ListView的继承者。根据谷歌的这篇文章所讲的,不支持CoordinatorLayout和ListView一起使用。你可以查看这篇指南,它帮助你过渡到RecyclerView

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.support.v7.widget.RecyclerView
         android:id="@+id/lvToDoList"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
.support.v7.widget.RecyclerView>

同时你还必须把RecyclerView升级到v22版本(我在这里使用的是 23.1.1),之前的v21不支持与CoordinatorLayout一起工作,确保你的build.gradle 文件是这样的:

我这个案例中使用了cardView

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 compile 'com.android.support:recyclerview-v7:23.1.1'
 compile 'com.android.support:cardview-v7:23.1.1'

使用CoordinatorLayout

接下来,你需要现为浮动操作按钮实现CoordinatorLayout Behavior。这个类用于定义按钮该如何响应包含在同一CoordinatorLayout之内的其它view。

创建一个继承自 FloatingActionButton.Behavior 名叫ScrollAwareFABBehavior.java的类。目前浮动操作按钮默认的behavior是为Snackbar让出空间,就如这个视频中的效果。

继承FloatingActionButton.Behavior

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package demo.turing.com.materialdesignwidget.floatingActionButton;

import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.View;

/**
 * MyApp
 *
 * @author Mr.Yang on 2016-03-04  10:48.
 * @version 1.0
 * @desc
 */
public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {


    /**
     * 因为是在XML中使用app:layout_behavior定义静态的这种行为,
     * 必须实现一个构造函数使布局的效果能够正常工作。
     * 否则 Could not inflate Behavior subclass error messages.
     *
     * @param context
     * @param attrs
     */
    public ScrollAwareFABBehavior(Context context, AttributeSet attrs) {
        super();
    }

    /**
     * 处理垂直方向上的滚动事件
     *
     * @param coordinatorLayout
     * @param child
     * @param directTargetChild
     * @param target
     * @param nestedScrollAxes
     * @return
     */
    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout,
                                       FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) {

        // Ensure we react to vertical scrolling
        return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL ||
                super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target,
                        nestedScrollAxes);
    }

    /**
     * 检查Y的位置,并决定按钮是否动画进入或退出
     *
     * @param coordinatorLayout
     * @param child
     * @param target
     * @param dxConsumed
     * @param dyConsumed
     * @param dxUnconsumed
     * @param dyUnconsumed
     */
    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child,
                               View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed,
                dyUnconsumed);

        if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) {
            // User scrolled down and the FAB is currently visible -> hide the FAB
            child.hide();
        } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) {
            // User scrolled up and the FAB is currently not visible -> show the FAB
            child.show();
        }
    }
}

将CoordinatorLayout Behavior与浮动操作按钮联系起来,通过xml的自定义属性pp:layout_behavior中定义它

activity_fab_animation.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    .support.v7.widget.RecyclerView
        android:id="@+id/rvToDoList"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    .support.design.widget.FloatingActionButton
        android:id="@+id/id_fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|right"
        android:layout_margin="16dp"
        android:src="@mipmap/ic_add_white"
        app:layout_anchor="@id/rvToDoList"
        app:layout_anchorGravity="bottom|right|end"
        app:layout_behavior="demo.turing.com.materialdesignwidget.floatingActionButton.ScrollAwareFABBehavior" />
.support.design.widget.CoordinatorLayout>

FabAnimation.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package demo.turing.com.materialdesignwidget.floatingActionButton;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import demo.turing.com.materialdesignwidget.R;

/**
 * Animating the Floating Action Button
 */
public class FabAnimation extends AppCompatActivity {

    private RecyclerView recyclerView ;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fab_animation);

        recyclerView = (RecyclerView) findViewById(R.id.rvToDoList);
        // 线性布局
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(new NormalRecyclerViewAdapter(this));
    }


}

NormalRecyclerViewAdapter.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package demo.turing.com.materialdesignwidget.floatingActionButton;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import demo.turing.com.materialdesignwidget.R;

/**
 * MyApp
 *
 * @author Mr.Yang on 2016-03-04  11:10.
 * @version 1.0
 * @desc
 */
public class NormalRecyclerViewAdapter extends RecyclerView.Adapter<NormalRecyclerViewAdapter.NormalTextViewHolder> {

    private final LayoutInflater mLayoutInflater;
    private final Context mContext;
    private String[] mTitles;

    public NormalRecyclerViewAdapter(Context context) {
        mTitles = context.getResources().getStringArray(R.array.titles);
        mContext = context;
        mLayoutInflater = LayoutInflater.from(context);
    }

    @Override
    public NormalTextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new NormalTextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
    }

    @Override
    public void onBindViewHolder(NormalTextViewHolder holder, int position) {
        holder.mTextView.setText(mTitles[position]);
    }

    @Override
    public int getItemCount() {
        return mTitles == null ? 0 : mTitles.length;
    }


    public static class NormalTextViewHolder extends RecyclerView.ViewHolder {

        TextView mTextView;


        NormalTextViewHolder(View view) {
            super(view);

            mTextView = (TextView) view.findViewById(R.id.text_view);

            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("NormalTextViewHolder", "onClick--> position = " + getPosition());
                }
            });
        }
    }
}

item_text.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cv_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="8dp"
    card_view:cardCornerRadius="4dp">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="20dp" />
android.support.v7.widget.CardView>

向下移动 FAB消失,向上移动时,FAB出现。


embedding(嵌入)-floatingactionbutton-in-header

效果图

操作步骤

This can be achieved by use CoordinatorLayout as the root view. We need to specify layout_anchor for the FAB to the top view and layout_anchorGravity to to bottom|right|end like this:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    "match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        "@+id/viewA"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="0.6"
            android:background="@android:color/holo_purple"
            android:orientation="horizontal"/>

        "@+id/viewB"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="0.4"
            android:background="@android:color/holo_orange_light"
            android:orientation="horizontal"/>

    

    .support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:clickable="true"
        android:src="@mipmap/ic_add_white"
        app:layout_anchor="@id/viewA"
        app:layout_anchorGravity="bottom|right|end"/>

.support.design.widget.CoordinatorLayout>

For details check out this stackoverflow post. See the CoordinatorLayout guide for more details on that layout.

Issues:

本文编写时,FAB 支持库仍然存在一些 bug,在 Kitkat 和 Lollipop 中分别运行示例代码,可以看到如下结果:

Lollipop 中的 FAB:

Kitkat 中的 FAB:

Issues 1: Android 4.4 和 5.0 中边缘显示

很容易看出,Lollipop 中存在边缘显示的问题。为了解决此问题,API21+ 的版本统一定义底部与右边缘空白为 16dp,Lollipop 以下版本统一设置为 0dp.

values/dimens.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dimen name="fab_margin_right">0dpdimen>
<dimen name="fab_margin_bottom">0dpdimen>

values-v21/dimens.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dimen name="fab_margin_right">16dpdimen>
<dimen name="fab_margin_bottom">16dpdimen>

布局文件的 FAB 中,也设置相应的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
    ...
    android:layout_marginBottom="@dimen/fab_margin_bottom"
    android:layout_marginRight="@dimen/fab_margin_right"/>

Issues 2: Android 5.0 中阴影显示

再看一遍上面的截图,会发现 Kitkat 中有阴影显示,而 Lollipop 中并没有。在 Lollipop 上,可以直接在 FAB 中设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
    ...
    app:fabSize="normal"
    app:borderWidth="0dp"
    android:layout_marginBottom="@dimen/fab_margin_bottom"
    android:layout_marginRight="@dimen/fab_margin_right"/>

Issues 3: FAB 中没有旋转动画

https://code.google.com/p/android/issues/detail?id=176116


With Third-Party FloatingActionButton

Using makovkastar/FloatingActionButton library makes floating buttons quite simple to setup. See the library readme and the sample code for reference.

在app/build.gradle:中添加依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dependencies {
    compile 'com.melnykov:floatingactionbutton:1.2.0'
}

在布局中添加com.melnykov.fab.FloatingActionButton 。记得在根布局中属性中添加xmlns:fab

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"http://schemas.android.com/apk/res/android"
             xmlns:fab="http://schemas.android.com/apk/res-auto"
             android:layout_width="match_parent"
             android:layout_height="match_parent">

    "@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    "@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|right"
            android:layout_margin="16dp"
            android:src="@drawable/ic_action_content_new"
            fab:fab_type="normal"
            fab:fab_shadow="true"
            fab:fab_colorNormal="@color/primary"
            fab:fab_colorPressed="@color/primary_pressed"
            fab:fab_colorRipple="@color/ripple" />
</FrameLayout>

依附到list

接下来,我们可以选择将FAB和一个ListView, ScrollView 或者 RecyclerView 关联起来,这样按钮就会随着list的向下滚动而隐藏,向上滚动而重现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ListView listView = (ListView) findViewById(android.R.id.list);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.attachToListView(listView); // or attachToRecyclerView

我们可以使用fab.attachToRecyclerView(recyclerView)来依附到一个RecyclerView,或者使用fab.attachToScrollView(scrollView)来依附到一个ScrollView。

调整按钮类型

浮动操作按钮有两种大小:默认的,这应该是最常用的情况,以及mini的,这应该只用于衔接屏幕上的其他元素。

可以把FAB的按钮类型调整为“正常”或者“mini”

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
    fab:fab_type="mini" />

FAB的显示和隐藏

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 带动画的显示和隐藏
fab.show();
fab.hide();
// 不带动画的
fab.show(false);
fab.hide(false);

监听滚动事件

我们可以监听所关联的list的滚动事件,以管理FAB的状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FloatingActionButton fab = (FloatingActionButton) root.findViewById(R.id.fab);
fab.attachToListView(list, new ScrollDirectionListener() {
    @Override
    public void onScrollDown() {
        Log.d("ListViewFragment", "onScrollDown()");
    }

    @Override
    public void onScrollUp() {
        Log.d("ListViewFragment", "onScrollUp()");
    }
}, new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        Log.d("ListViewFragment", "onScrollStateChanged()");
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, 
        int totalItemCount) {
        Log.d("ListViewFragment", "onScroll()");
    }
});

手动实现

除了使用库之外,我们还可以自己开发动操作按钮。关于手动实现浮动操作按钮,可以查看big nerd ranch guide 以及 survivingwithandroid walkthrough。

参考外文: Floating Action Buttons

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/03/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
走进黑盒:SQL是如何在数据库中执行的?
对很多开发者来说,数据库就是个黑盒子,你会写 SQL,会用数据库,但不知道盒子里面到底是怎么一回事儿,这样你只能机械地去记住别人告诉你的那些优化规则,却不知道为什么要遵循这些规则,也就谈不上灵活运用。
码农架构
2020/11/11
1.7K0
走进黑盒:SQL是如何在数据库中执行的?
为什么大家说mysql数据库单表最大两千万?依据是啥?
想必大家也听说过数据库单表建议最大2kw条数据这个说法。如果超过了,性能就会下降得比较厉害。
小白debug
2022/06/20
1.8K2
为什么大家说mysql数据库单表最大两千万?依据是啥?
一个反直觉的sql
在《容易引起雪崩的两个处理》里,我提到一个慢查询的问题。本文先从整洁架构的角度讲讲慢查询sql完成的功能以及设计,再介绍对sql进行的实施测试现象以及思考。
静儿
2021/11/16
3770
一个反直觉的sql
图文并茂说MySQL索引——入门进阶必备
  你一定看到过这样的例子,索引是什么,你要查字典,不可能从第一页翻到最后一页去查找,你会先查找拼音或者偏旁部首,然后直接跳转到对应的页小范围的一条一条查找,这样会快得多。
砖业洋__
2023/05/06
2950
图文并茂说MySQL索引——入门进阶必备
Mysql-Innodb : 从一个字节到整个数据库表了解物理存储结构和逻辑存储结构
   一块原生的(Raw)物理磁盘,可以把他看成一个字节一个字节单元组成的物理存储介质
执生
2020/09/27
8590
MySQL 不完全入门指南
由于 MySQL 的整个体系太过于庞大,文章的篇幅有限,不能够完全的覆盖所有的方面。所以我会尽可能的从更加贴进我们日常使用的方式来进行解释。
冬夜先生
2021/10/08
3530
实现一个微型数据库
说二叉查找树是一种查找效率很高的数据结构,它有三个特点: (1)每一个节点最多仅仅有两个子树。 (2)左子树都为小于父节点的值,右子树都为大于父节点的值。 (3)在n个节点中找到目标值,一般仅仅须要log(n)次比較。 二叉查找树的结构不适合数据库,由于他的查找效率与层数有关。越处在下层的数据,就须要越多次的比較。极端的情况下,n个数据须要n次比較才干找到目标值。对于数据库来说,每进入一层,就要从硬盘读取一次数据,这很致命,由于硬盘的读取时间远远大于数据处理时间,数据库读取硬盘的次数越少越好。 B树是对二叉查找树的改进。它的设计思想是,将相关数据尽量集中在一起,以便一次读取多个数据,降低硬盘操作次数。
全栈程序员站长
2022/07/12
4140
实现一个微型数据库
mysql|聊完了mysql索引,面试官直接给我涨了2000!
mysql索引真的是一个让人不得不说的话题,这个东西你在面试中会用到,在实际的工作中也会用到,这更是一个专业的DBA所必须掌握的内容,它的重要性体你在大厂的面试题汇总也可以看到,属于必问的一个内容。
moon聊技术
2021/07/28
3990
mysql|聊完了mysql索引,面试官直接给我涨了2000!
索引很难么?带你从头到尾捋一遍MySQL索引结构,不信你学不会!
Hello我又来了,快年底了,作为一个有抱负的码农,我想给自己攒一个年终总结。自上上篇写了手动搭建Redis集群和MySQL主从同步(非Docker)和上篇写了动手实现MySQL读写分离and故障转移之后,索性这次把数据库中最核心的也是最难搞懂的内容,也就是索引,分享给大家。
范蠡
2019/12/24
6800
索引很难么?带你从头到尾捋一遍MySQL索引结构,不信你学不会!
玩转Mysql系列 - 第24篇:如何正确的使用索引?
学习索引,主要是写出更快的sql,当我们写sql的时候,需要明确的知道sql为什么会走索引?为什么有些sql不走索引?sql会走那些索引,为什么会这么走?我们需要了解其原理,了解内部具体过程,这样使用起来才能更顺手,才可以写出更高效的sql。本篇我们就是搞懂这些问题。
路人甲Java
2019/10/17
2.1K0
Go语言从0到1实现最简单的数据库!
导语 | 后台开发对于数据库操作是必不可少的事情,了解数据库原理对于平常的工作的内功积累还是很有帮助的,这里实现一个最简单的数据库加深自己对数据库的理解。 一、go实现数据库目的 了解数据是如何在内存和磁盘存储的 数据是怎么移动到磁盘 主键是如何保持唯一性 索引是如何形成 如何进行全表遍历 熟悉Go语言对内存以及文件操作 二、数据库选择SQLite 选择SQLite(https://www.sqlite.org/arch.html)原因是数据库完全开源,实现简单,并且有C语言最简单的实现版本,因此参考go语
腾讯云开发者
2022/04/26
7770
Go语言从0到1实现最简单的数据库!
MySQL底层概述—4.InnoDB数据文件
一个表空间会包含多个段,一个段会包含多个区(256个区就是一个组);一个区又会包含64个页,一个页里面又会包含一行一行的记录Row。
东阳马生架构
2025/02/11
1280
深入浅出——深入分析MySQL索引和B+树(基于InnoDB和MyISAM引擎分析),看完直呼:妙哉!
索引是数据库提供的利于快速查询的机制,索引类似于书籍目录,当查询条件那一列建立了索引之后,那么数据库会去硬盘索引文件中找到满足查询条件的(数据的)物理位置, 根据位置就可以定位并获取到数据。
Karos
2023/06/17
1.4K0
深入浅出——深入分析MySQL索引和B+树(基于InnoDB和MyISAM引擎分析),看完直呼:妙哉!
从另外一个角度看什么是数据库
或许你还能想到 Redis、Zookeeper,甚至是 Elasticsearch ……
Java3y
2019/09/25
4600
从另外一个角度看什么是数据库
MYSQL数据库-索引
MYSQL数据库-索引 零、前言 一、索引概念 二、认识磁盘 三、理解索引 1、如何理解Page 2、B+ vs B 3、聚簇索引 VS 非聚簇索引 4、普通索引 5、总结 四、索引操作 1、创建索引 2、查询索引 3、删除索引 零、前言 本章主要讲解MYSQL数据库中的索引这一重要知识点 一、索引概念 索引的价值: 提高数据库的性能,索引是物美价廉的东西了:不用加内存,不用改程序,不用调sql,只要执行正确的create index ,查询速度就可能提高成百上千倍,但是查询速度的提高是以插入、更新
用户9645905
2022/12/11
2.1K0
MYSQL数据库-索引
SQL如何在数据库中执行
数据库的服务端,可分为执行器(Execution Engine) 和 存储引擎(Storage Engine) 两部分:
JavaEdge
2023/01/06
3.1K0
SQL如何在数据库中执行
【Java面试八股文宝典之MySQL篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day19
比如:select * from t_user where username = '' and password '''or 1 =1#
陶然同学
2023/04/09
6810
【Java面试八股文宝典之MySQL篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day19
数据库索引,你要了解的都在这里!
数据库索引好比是一本书前面的目录,能加快数据库的查询速度。索引是对数据库表中一个或多个列(例如,User 表的 '姓名' 列)的值进行排序的结构。如果想按特定用户的姓名来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
JAVA日知录
2020/05/09
6090
Innodb如何实现表--下篇
PageHeader是数据页特有的,专门用来记录数据页的状态信息,共占用48字节:
大忽悠爱学习
2022/12/09
3980
Innodb如何实现表--下篇
InnoDB(5)索引页 --mysql从入门到精通(十)
上篇文章介绍了行溢出,表中最多创建65535个字节,而null值列表占用一个字节,变长字段长度列表占用两个字节,所以最长是65532个字节。而varchar(M)填写多少,要根据不同的字符集来规定,比如ascii一个字符是一个字节,gbk最大是2个字节,utf8最大是3个字节。数据也会溢出,数据溢出,则是会分成若干页存储,而compact行格式,真实数据列表会780左右字节,然后存页的地址值,方便查找剩余的真是数据。Mysql5.7后默认用dynamic行格式,而dynamic行格式在行溢出的情况下真实数据列表只存储页码地址值。Redundant则是会有压缩算法压缩页码分页,更节省空间。
用户9919783
2022/07/26
4040
推荐阅读
相关推荐
走进黑盒:SQL是如何在数据库中执行的?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文