Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >区块链基础:非对称算法

区块链基础:非对称算法

作者头像
程裕强
发布于 2022-05-06 11:51:23
发布于 2022-05-06 11:51:23
39600
代码可运行
举报
运行总次数:0
代码可运行

1.Hash算法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.hadron.security;

import java.security.MessageDigest;
import java.util.UUID;

import org.eclipse.jetty.util.security.Credential.MD5;

/**
 * crypto['krɪptoʊ]秘密成员,
 * 一些语言的crypto模块的目的是为了提供通用的加密和哈希算法
 * 加密工具类
 */
public class CryptoUtil {
    //工具类,隐藏构造器
    private CryptoUtil() {}

    /**
     * 计算给定字符串的SHA256值
     */
    public static String sha256(String str) {
        MessageDigest messageDigest;
        String hash = "";
        try {
            messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.update(str.getBytes("UTF-8"));
            hash = byte2Hex(messageDigest.digest());
        } catch (Exception e) {
            System.out.println("getSHA256 is error" + e.getMessage());
        }
        return hash;
    }

    /**
     * 计算str的md5码(技巧:去除前几位,增强安全性)
     */
    public static String md5(String str) {
        String resultStr = MD5.digest(str);
        return resultStr.substring(4, resultStr.length());
    }

    /**
     * UUID的目的是让分布式系统中的所有元素都能有唯一的辨识
     * 获取一个UUID值,默认格式带有"-",需要删除所有的"-"
     */
    public static String getUUID() {
        return UUID.randomUUID().toString().replaceAll("\\-", "");
    }

    /**
     * 二进制字节数据转换为十六进制字符串形式
     * @param bytes
     */
    private static String byte2Hex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        String tmp;
        for (int i = 0; i < bytes.length; i++) {
            /**
             * 注意toHexString(int i)的参数类型是32位int型,而传输入8位byte型数据会转换int型。
             * 转换后高24为也看作有效位,正数不影响,而负数会导致错误。
             * java中采用的是补码的形式表示负整数,比如byte的-1(0xff,11111111),会转换成int型的-1(0xffffffff),
             * 而oxff默认是int型,表示为0000 0000 0000 0000 0000 0000 1111 1111
             * 一个byte跟0xff &运算,高的24个比特就总会被清0,得到我们想要的结果。
             */
            tmp = Integer.toHexString(bytes[i] & 0xFF);
            if (tmp.length() == 1) {
                sb.append("0");
            }
            sb.append(tmp);
        }
        return sb.toString();
    }

    public static void main(String[] args){
        String s="chengyuqiang";
        System.out.println(CryptoUtil.md5(s));
        System.out.println(CryptoUtil.sha256(s));
        System.out.println(CryptoUtil.getUUID());
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1163a12be8b90e692445a7115ca900f4
c7a8233d922f3db03f1c7a0864675cb5092ce850d033b7ea07ca5208da27edfe
b286928d476b4de0aa5b8c83b7b27e54

2、RSA非对称算法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.hadron.security;

import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
import javax.crypto.Cipher;


/**
 * RSA安全编码组件
 */
public abstract class RsaUtil extends Coder {
    public static final String KEY_ALGORITHM = "RSA";
    public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
    private static final String PUBLIC_KEY = "RSAPublicKey";
    private static final String PRIVATE_KEY = "RSAPrivateKey";

    /**
     * 初始化密钥
     */
    public static Map<String, Object> initKey() throws Exception {
        //RSA密钥对生成器
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
        //初始化
        keyPairGen.initialize(1024);
        //耗时操作,动态生成密钥对
        KeyPair keyPair = keyPairGen.generateKeyPair();
        //获取公钥
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        //获取私钥
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        //保存密钥对
        Map<String, Object> keyMap = new HashMap<String, Object>(2);
        keyMap.put(PUBLIC_KEY, publicKey);
        keyMap.put(PRIVATE_KEY, privateKey);
        return keyMap;
    }
    /**
     * 取得私钥
     */
    public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {
        Key key = (Key) keyMap.get(PRIVATE_KEY);
        return encryptBASE64(key.getEncoded());
    }

    /**
     * 取得公钥
     */
    public static String getPublicKey(Map<String, Object> keyMap) throws Exception {
        Key key = (Key) keyMap.get(PUBLIC_KEY);
        return encryptBASE64(key.getEncoded());
    }

    /*******************公钥加密,私钥解密**************************/

    /**
     * 消息发送者用对方公钥加密
     */
    public static byte[] encryptByPublicKey(byte[] data, String key) throws Exception {
        // 对公钥BASE64解密,取得公钥
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(decryptBASE64(key));
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key publicKey = keyFactory.generatePublic(x509KeySpec);

        // 对数据加密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        //将Cipher初始化为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        //数据将被加密或解密
        return cipher.doFinal(data);
    }
    /**
     * 消息接收者用自己的私钥解密
     */
    public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception {
        // decryptBASE64(key)对密钥解密,取得私钥
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(decryptBASE64(key));
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        // 对数据解密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        //将Cipher初始化为解密模式
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        //数据将被加密或解密
        return cipher.doFinal(data);
    }

    /*******************秘钥加密,公钥验证***********************/

    /**
     * 消息发送者用自己的私钥加密
     */
    public static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception {
        // 对密钥解密,取得私钥
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(decryptBASE64(key));
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        // 对数据加密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        //加密模式
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        return cipher.doFinal(data);
    }
    /**
     * 用公钥解密
     */
    public static byte[] decryptByPublicKey(byte[] data, String key) throws Exception {
        //对密钥解密, 取得公钥
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(decryptBASE64(key));
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        Key publicKey = keyFactory.generatePublic(x509KeySpec);
        // 对数据解密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        //解密模式
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        return cipher.doFinal(data);
    }

    /****************数字签名:私钥加密,公钥验证**********************/

    /**
     * 用发送者的私钥对信息生成数字签名
     * @param data : 加密数据
     * @param privateKey: 私钥
     */
    public static String sign(byte[] data, String privateKey) throws Exception {
        // 解密由base64编码的私钥,构造PKCS8EncodedKeySpec对象
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(decryptBASE64(privateKey));
        //指定的加密算法RSA
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        //取私钥匙对象
        PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
        //Signature类用来提供数字签名算法功能
        //可以将签名算法指定为 MD2withRSA、MD5withRSA 或 SHA1withRSA
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        //用私钥初始化这个用于签名的对象
        signature.initSign(priKey);
        //使用指定的byte数组更新要签名或验证的数据
        signature.update(data);
        //sign()返回已更新数据的签名字节,再进行BASE64加密
        return encryptBASE64(signature.sign());
    }

    /**
     * 使用发送者的公钥校验数字签名
     * 通过发送者的公钥publicKey验证他签名内容sign是否符合data数据
     * @param data: 加密数据
     * @param publicKey: 公钥
     * @param sign: 数字签名
     * @return 校验成功返回true 失败返回false
     */
    public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
        // 解密由base64编码的公钥,构造X509EncodedKeySpec对象
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decryptBASE64(publicKey));
        // 指定加密算法RSA
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        // 取公钥匙对象
        PublicKey pubKey = keyFactory.generatePublic(keySpec);
        //Signature类用来提供数字签名算法功能
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        //用公钥初始化验证对象
        signature.initVerify(pubKey);
        //使用指定的byte数组更新要签名或验证的数据
        signature.update(data);
        // 验证签名是否正常
        return signature.verify(decryptBASE64(sign));
    }

    public static void main(String[] args) throws Exception{
        String s="chengyuqiang";
        /**
         * 测试公钥加密,私有解密
         */
        Map<String, Object> map=RsaUtil.initKey();
        String publicKey=RsaUtil.getPublicKey(map);
        String privateKey=RsaUtil.getPrivateKey(map);
        System.out.println("公钥:\n"+publicKey);
        System.out.println("私钥:\n"+privateKey);
        //公钥加密
        byte[] msg=RsaUtil.encryptByPublicKey(s.getBytes(), publicKey);
        //秘钥解密
        msg=RsaUtil.decryptByPrivateKey(msg, privateKey);
        System.out.println("解密:\n"+new String(msg));

        /**
         * 测试私签名,公钥验证签名
         */
        // 产生签名
        String sign = RsaUtil.sign(s.getBytes(), privateKey);
        System.out.println("签名内容:\n"+sign);
        //验证签名
        boolean status = RsaUtil.verify(s.getBytes(), publicKey, sign);
        System.out.println("签名正确:\n"+status);
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2N1dAK2NzzcOjRwb3rBjT+NvpMKKgL98Pr3D0
jE99hfJL2MpuKflA0U18EKnZT1QjrninAeLHiR1BlnuJpHVGKNPkzXuIhggiHlvdb9WwsfB+u+pf
Igca7cURYR+4bELE+hlUVP8nyMuD9Vs8bY23oHG2Ff/svVQEo/j4uOMAywIDAQAB

私钥:
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALY3V0ArY3PNw6NHBvesGNP42+kw
oqAv3w+vcPSMT32F8kvYym4p+UDRTXwQqdlPVCOueKcB4seJHUGWe4mkdUYo0+TNe4iGCCIeW91v
1bCx8H676l8iBxrtxRFhH7hsQsT6GVRU/yfIy4P1WzxtjbegcbYV/+y9VASj+Pi44wDLAgMBAAEC
gYBOOEFvHXEK1CiIXcQi67CYxfp5BtS42PPzQsfFYrn401gosP5s/f2ukmqluG2BCKnAy3OllYyp
RTXW4udTNdLVOiglX5TSCk1zp3Hn6oLbbjWIpoqAhx5PJslZY35MscNYVViz69FwLHjCeDWRitsV
f/eDHyC+r6vb3PQTgpjegQJBAOvtWqLhMNhAOel14pirf+A520xz/gzpSj/dCzTS53oLGvCJqzn1
HJqA4xmhEf8MMcHN4+SiVtjQdKVINaFbeUECQQDFuCBzCMLKHNfrUp35lOlnmAT5RBEU+0CV85jl
oERpLTU1v6igsP6mxXJXXRQpNzP2orN1IbrVVwF8uuUU/wsLAkBiDtH4Fs69YtxvG08mE0ngAUwT
l7ZE2YXBy3bH6szI3erBhQbE3QqZcO5zDY40SnY3zgJlWc/s559DvyKDQUjBAkEAqa7filnWcgZW
98orcWpu9Uzt186mqk8Gmqo4abklfO4jYEFfwqijoxSIkJl9F/IcUmpHgRq1cSn+SMFMoLxRCQJA
PJFE5keSZgjJpGsMAdEIpHKKUxF5vd+oS9+Z7EpSn7VGTRPLycSIDKQT2F9/QV1z5IKni1jqbnXs
imRw1coviw==

解密:
chengyuqiang
签名内容:
BqJgQ4ciZNH0bE0TQeTgQQbF+h0jPNauHbgc95L8QggwD0p8qb4fdEjsmevdiN0OszOqyR9z71S9
LXCeH+ZeKVZagRWG0jx0Bfk74Rf5Pt2MMPqjzlDRfCTJyg0z8GjC/U70IaxgfgkrFVf3rsk4XzAB
R045Sjf2P+nJf/hf4wE=

签名正确:
true

3、RsaUtil 的父类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.hadron.security;

import java.security.MessageDigest;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * 基础加密组件
 * 
 */
public abstract class Coder {
    public static final String KEY_SHA = "SHA";
    public static final String KEY_MD5 = "MD5";
    //HMAC(Hash Message Authentication Code),散列消息鉴别码,基于密钥的Hash算法的认证协议
    public static final String KEY_MAC = "HmacMD5";

    //BASE64实现主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。

    /**
     * BASE64加密,把任意序列的8位字节描述为一种不易被人直接识别的形式。
     * BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充
     */
    public static String encryptBASE64(byte[] key) throws Exception {
        return (new BASE64Encoder()).encodeBuffer(key);
    }
    /**
     * BASE64解密
     */
    public static byte[] decryptBASE64(String key) throws Exception {
        return (new BASE64Decoder()).decodeBuffer(key);
    }

    /**
     * JDK提供的MD5算法实现
     */
    public static byte[] encryptMD5(byte[] data) throws Exception {
        MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
        md5.update(data);
        return md5.digest();
    }

    /**
     * JDK提供的SHA算法
     */
    public static byte[] encryptSHA(byte[] data) throws Exception {
        MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
        sha.update(data);
        return sha.digest();

    }

    /**
     * 初始化HMAC密钥
     */
    public static String initMacKey() throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
        SecretKey secretKey = keyGenerator.generateKey();
        return encryptBASE64(secretKey.getEncoded());
    }

    /**
     * HMAC加密
     */
    public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
        SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        mac.init(secretKey);
        return mac.doFinal(data);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 处理海量数据时的一些优化查询速度方法
在参与实际项目中,当 MySQL 表的数据量达到百万级时,普通的 SQL 查询效率呈直线下降,而且如果 where 中的查询条件较多时,其查询速度无法容忍。想想可知,假如我们查询淘宝的一个订单详情,如果查询时间高达几十秒,这么高的查询延时,任何用户都会抓狂。因此如何提高 SQL 语句查询效率,显得十分重要。 查询速度慢的原因 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O 吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络速度慢
小莹莹
2018/04/24
2.5K0
MySQL 处理海量数据时的一些优化查询速度方法
mysql优化sql语句的方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
IT工作者
2022/01/04
1.3K0
百万数据查询优化技巧三十则
对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行
用户1257393
2018/01/30
7720
Mysql数据库优化
CREATE DEFINER=`root`@`%` PROCEDURE `yushenghuan`(num int)#num 是循环的次数 begin         declare i int default 0;         WHILE i < num do             INSERT INTO yusheng (id, name ,info ,type)             VALUES (i, i+'@yusheng', '我携满天星辰以赠你,仍觉满天星辰不如你', 1);             SET  i = i + 1;         END while;     end
余生大大
2022/10/25
1.9K0
Mysql数据库优化
数据库优化总结
  希望大家阅读之后,感觉好的话可以收藏或者推荐给更多的人,让更多的人看到,如果有什么错误或者有争议的地方,欢迎大家纠正以及补充。
Kevin_Zhang
2019/01/28
7990
百万条数据快速查询优化技巧参考
所以的优化并不是绝对,具体得根据业务实际情况 百万条数据快速查询优化技巧 1.应尽量避免在where子句中使用!=或<>操作符 2.应尽量避免在where子句中使用or来连接条件 如:select Id from t where num=10 or num=20 可以这样查询 Select id from t where num=10 Union all Select id from t where num=20 3. in 和not in 也要慎用,否则会导致全表扫描 如:select id from t
逸鹏
2018/04/11
1.4K0
30个MySQL数据库常用小技巧,吐血整理。
【Server Configuration Type】该选项用于设置服务器的类型。单击该选项右侧的向下按钮, 即可看到包括3个选项。
可可的测试小栈
2019/10/17
1K0
数据库优化方案之SQL脚本优化
随着数据库数据越来越大,数据单表存在的数据量也就随之上去了,那么怎么样让我们的脚本查询数据更快呢?
用户1112962
2019/11/15
1.5K0
提高数据库的查询速率及其sql语句的优化问题
a、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
追逐时光者
2019/08/28
1K0
海量数据查询优化
这是我面试的一家数据维护业务公司的面试题,虽然这个职位并不是我所期望的Java开发的工作,自己还是想把握好每一次机会,最后还是去尝试了一下。
用户1148526
2019/05/25
1.2K0
性能调优之MYSQL高并发优化
一、数据库结构的设计 表的设计具体注意的问题: 1、数据行的长度不要超过8020字节,如果超过这个长度的话在物理页中这条数据会占用两行从而造成存储碎片,降低查询效率。 2、能够用数字类型的字段尽量选择数字类型而不用字符串类型的(电话号码),这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。 3、对于不可变字符类型char和可变字符类型varchar 都是8000字节,char查询快,但是耗存储空间,varchar查询相
wangxl
2018/03/08
2K0
java面试(3)SQL优化
java面试(3)SQL优化
Java架构师必看
2021/06/16
3.4K0
java面试(3)SQL优化
9.1.MySQL实践@在一个千万级的数据库查寻中,如何提高查询效率
        a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。          b. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0
itjim
2019/11/27
1.9K0
9.1.MySQL实践@在一个千万级的数据库查寻中,如何提高查询效率
30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
吴生
2018/03/27
2.3K0
30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
SQL优化完整详解
通过 SHOW STATUS 可以提供服务器状态信息,也可以使用 mysqladmin extende d-status 命令获得。 SHOW STATUS 可以根据需要显示 session 级别的统计结果和 global级别的统计结果。
黄规速
2022/04/14
1.3K0
SQL优化完整详解
[Java面试十二]数据库概念相关
1. 什么是存储过程?它有什么优点? 答:存储过程是一组予编译的SQL语句,它的优点有: 允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。 允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。 减少网络流量,例如一个需要数百行的SQL代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。 更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。 2. oracle的存储过程和函数有什么区别? Oracle
一枝花算不算浪漫
2018/05/18
1.8K0
Java面试:2021.05.19
在微服务架构下,多个服务之间通常会定义明确上下游关系,下游系统可以依赖上游系统,下游系统可以通过API查询或修改上游系统的数据;反过来则不然,上游系统不应该知道下游系统的存在,也就是说上游系统不能依赖下游系统,上游系统的变化只能通过异步事件的方式发出,下游系统监听事件并基于事件做对应的数据状态变化。
夕梦
2021/05/27
5590
Java面试:2021.05.19
在一个千万级的数据库查寻中,如何提高查询效率?
A. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
Java后端技术
2018/08/09
1.5K0
在一个千万级的数据库查寻中,如何提高查询效率?
1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 orderby 涉及的列上建立索引;
用户1655470
2018/10/22
1.7K0
mysql慢查询优化-千万级数据量
最近在忙其他项目,偶然发现之前的项目中,有个定时刷新告警信息的模块查询比较慢,简单的一个关联查询,尽然耗了20多秒才能出来, 才发现表的数据量已经达到了700万,我擦,我这暴脾气,不知道我强迫症吗,于是下定决心1个小时解决了丫的 (—_— 后来,用时之久啊,人都消瘦了许多)
零式的天空
2022/03/25
1.9K0
mysql慢查询优化-千万级数据量
推荐阅读
相关推荐
MySQL 处理海量数据时的一些优化查询速度方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验