闲暇时光 🌑
闲暇时光
我の闲暇时光 time flies
静谧时光,执笔抒心,岁月痕迹甚好。
109
21
58



MySQL大数据SQL优化

2021-04-28 09:25:39 - 2025-07-05 00:53:03
無慕 - 3.44K - 3秒 - 1.61K
  • 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

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

select id from t where num is null

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num=0
  • 应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。

  • 应尽量避免在 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
  • in 和 not in 也要慎用,否则会导致全表扫描。如:

select id from t where num in(1,2,3)

对于连续的数值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3
  • 下面的查询也将导致全表扫描:

select id from t where name like ‘%李%’

若要提高效率,可以考虑全文检索。

  • 如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。

如下面语句将进行全表扫描:

select id from t where num=@num

可以改为强制查询使用索引:

select id from t with(index(索引名)) where num=@num
  • 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

select id from t where num/2=100

应改为:

select id from t where num=100*2
  • 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

select id from t where substring(name,1,3)=’abc’

name以abc开头的id应改为:

select id from t where name like ‘abc%’
  • 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

  • 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

  • 不要写一些没有意义的查询,如需要生成一个空表结构:

select col1,col2 into #t from t where 1=0

这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:

create table #t(…)

  • 很多时候用 exists 代替 in 是一个好的选择:

select num from a where num in(select num from b)

用下面的语句替换:

select num from a where exists(select 1 from b where num=a.num)
  • 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

  • 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

  • 应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。

  • 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

  • 尽可能的使用 char/nchar代替varchar/nvarchar ,因为首先固定长度的char/nchar比可变长度的varchar/nvarchar 存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

  • 任何地方查询都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

  • 尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。

  • 避免频繁创建和删除临时表,以减少系统表资源的消耗。

  • 临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。

  • 在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

  • 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

  • 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

  • 使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。

  • 与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时 间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。

  • 在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送DONE_IN_PROC 消息。

  • 尽量避免大事务操作,提高系统并发能力。

  • 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

编程 - 数据库
MySQL 笔记

浏览器头部title切换

2021-04-27 09:30:44 - 2025-07-05 00:53:03
無慕 - 1.88K - 22秒 - 2.00K

自己查找函数写的菜鸟代码,不喜勿喷~

//浏览器检测切换
var back_tab_settimeout;
var leave_tab_setinterval;
var leave_arr = {
    0: '∑(っ°Д°;)っ卧槽,人不见了~',
    1: 'Σσ(・Д・;)我可什么都没做!!!',
    2: '(σ゚∀゚)σ..:*☆哎哟,干嘛去了',
    3: '(*╹▽╹*) 回来看看我好不好',
    4: '凸(`0´)凸 鄙视中途离站',
    5: '(´థ౪థ)σ你竟然是这样的人',
    6: '(╥╯﹏╰╥)ง 不理我我走了',
    7: 'Σ(σ`•ω•´)σ 起飞,再见!',
    8: '(((┏(; ̄▽ ̄)┛ 装完逼就跑!',
};
var leave_arr_length = Object.keys(leave_arr).length;
if (document.hidden !== undefined) {
    document.addEventListener('visibilitychange', () => {
        var is_tab_windows = document.hidden;
        if (is_tab_windows) {
            clearTimeout(back_tab_settimeout);
            $('link[rel=icon]').attr('href', '/favicon2.ico');
            $('title').html("。。。。。。");
            var setInterval_num = 0;
            leave_tab_setinterval = setInterval(function () {
                if (leave_arr_length <= setInterval_num) {
                    setInterval_num = 0;
                }
                $('title').html(leave_arr[setInterval_num]);
                setInterval_num++;
            }, 5000);
        } else {
            clearInterval(leave_tab_setinterval);
            $('link[rel=icon]').attr('href', '/favicon3.ico');
            $('title').html('(((o(*゚▽゚*)o)))♡ 欢迎回来~');
            back_tab_settimeout = setTimeout(function () {
                $('link[rel=icon]').attr('href', '/favicon.ico');
                $('title').html("{:get_web_config_info('name')}");
            }, 5000)
        }

    })
}

编程 - 前端
浏览器 问题 JavaScript 收藏

获取移动设备的类型和型号

2021-04-27 09:30:05 - 2025-07-05 00:53:03
無慕 - 1.85K - 18秒 - 1.86K

需要引入js文件:mobile-detect.js

function get_mobile_data() {
    //设置默认值
    var visit_mobile_details = {'system': '', 'system_type': ''};
    var device_type = navigator.userAgent;//获取userAgent信息
    var md = new MobileDetect(device_type);//初始化mobile-detect
    var os = md.os();//获取系统
    var model = "";
    if (os == "iOS") {
        //ios系统的处理
        os = md.os() + md.version("iPhone");
        model = md.mobile();
    } else if (os == "AndroidOS") {
        //Android系统的处理
        os = md.os() + md.version("Android");
        var sss = device_type.split(";");
        var i = sss.contains("Build/");
        if (i > -1) {
            model = sss[i].substring(0, sss[i].indexOf("Build/"));
        }
    }
    visit_mobile_details.system = os;//系统类型
    visit_mobile_details.system_type = model;//设备型号
    return visit_mobile_details;
}

编程 - 前端
问题 JavaScript

禁止选中和右键功能

2021-04-27 09:29:47 - 2025-07-05 00:53:03
無慕 - 138 - 34秒 - 1.69K
document.oncontextmenu=new Function("event.returnValue=false");
document.onselectstart=new Function("event.returnValue=false");

编程 - 前端
问题 JavaScript

获取浏览器信息

2021-04-27 09:29:27 - 2025-07-05 00:53:03
無慕 - 3.98K - 41秒 - 1.77K

返回的是:浏览器类型和版本号

function getExplorerInfo() {
    let explorer = window.navigator.userAgent;
    explorer = explorer.toLowerCase();
    //遨游浏览器
    if (explorer.indexOf('maxthon') >= 0) {
        let ver = explorer.match(/maxthon\/([\d.]+)/)[1] || '';
        return '傲游浏览器' + ver;
    }
    //QQ浏览器
    if (explorer.indexOf('qqbrowser') >= 0) {
        let ver = explorer.match(/qqbrowser\/([\d.]+)/)[1] || '';
        return 'QQ浏览器' + ver;
    }
    //搜狗浏览器
    if (explorer.indexOf('se 2.x') >= 0) {
        return '搜狗浏览器' + ver;
    }
    //搜狗浏览器
    if (explorer.indexOf('slbrowser') >= 0) {
        let ver = explorer.match(/slbrowser\/([\d.]+)/)[1] || '';
        return '联想浏览器' + ver;
    }
    //ie
    if (explorer.indexOf('msie') >= 0) {
        let ver = explorer.match(/msie ([\d.]+)/)[1] || '';
        return 'IE' + ver;
    }
    //firefox
    else if (explorer.indexOf('firefox') >= 0) {
        let ver = explorer.match(/firefox\/([\d.]+)/)[1] || '';
        return 'Firefox' + ver;
    }
    //Chrome
    else if (explorer.indexOf('chrome') >= 0) {
        let ver = explorer.match(/chrome\/([\d.]+)/)[1] || '';
        return 'Chrome' + ver;
    }
    //Opera
    else if (explorer.indexOf('opera') >= 0) {
        let ver = explorer.match(/opera.([\d.]+)/)[1] || '';
        return 'Opera' + ver;
    }
    //Safari
    else if (explorer.indexOf('safari') >= 0) {
        let ver = explorer.match(/version\/([\d.]+)/)[1] || '';
        return 'Safari' + ver;
    }
    if (explorer.indexOf('edge') >= 0) {
        let ver = explorer.match(/edge\/([\d.]+)/)[1] || '';
        return 'edge' + ver;
    }
    return '未知浏览器';
}

编程 - 前端
问题 JavaScript

判断是否为移动设备

2021-04-27 09:28:58 - 2025-07-05 00:53:03
無慕 - 775 - 3秒 - 1.70K
function isMobile() {
    if (navigator.userAgent.match(/Android/i)
        || navigator.userAgent.match(/webOS/i)
        || navigator.userAgent.match(/iPhone/i)
        || navigator.userAgent.match(/iPad/i)
        || navigator.userAgent.match(/iPod/i)
        || navigator.userAgent.match(/BlackBerry/i)
        || navigator.userAgent.match(/Windows Phone/i)
    ) return true;
    return false;
}

编程 - 前端
问题 JavaScript

分页(或者添加新元素)后,jQuery不执行。

2021-04-27 09:28:33 - 2025-07-05 00:53:03
無慕 - 261 - 3秒 - 1.77K

出现原因:页面上通过jQuery或其他方式添加某些新元素,而新元素无法和页面第一次加载的事件进行绑定。

例如:对button添加一个点击事件,当通过jQuery添加一个新的button元素时,就可能无法触发这个事件。

delegate() 方法的事件可以处理当前或者未来元素(比如有脚本创建建的新元素)

$(document).delegate("[id='support']","click",function(){
  alert('点击成功~');
});

编程 - 前端
jQuery 问题

页面滑动到底触发事件

2021-04-27 09:26:44 - 2025-07-05 00:53:03
無慕 - 684 - 13秒 - 1.74K

此方法是根据下滑高度加一个值大于当前页面高度来判断的,所以使用时需要自行监测滑动高度和当前页的高度,修改800这个数值具体大小。

$(function() {
    $(document).scroll(function() {
        var scrollHeight = $(document).height();
        console.log('当前高度:'+$(document).scrollTop(),'页面高度'+scrollHeight)
        if ($(document).scrollTop()+800 >= scrollHeight) {
            console.log('到底了~')
        }
    })
})

编程 - 前端
jQuery 前端

debugger说明

2021-04-27 09:25:33 - 2025-07-05 00:53:03
無慕 - 97 - 39秒 - 1.88K

在js代码中写入debugger,回到浏览器F12打开检查窗口,触发js后从debugger开始调试,按F10执行一行代码,并在代码后面显示数值。

使用 debugger 语句类似于在代码中设置断点。

编程 - 前端
笔记 前端 JavaScript jQuery

老祖宗们跨时代的博弈

2021-03-19 20:52:52 - 2025-07-05 00:53:03
無慕 - 933 - 3.95分钟 - 1.72K

古代贤者留下不少金句,经常被人们拿来说[老祖宗留下来的都是有道理的],但其实不乏有相对不同的观点:

  1. 兔子不吃窝边草!~VS~近水楼台先得月!

  2. 宰相肚里能撑船!~VS~有仇不报非君子!

  3. 人不犯我,我不犯人!~VS~先下手为强,后下手遭殃!

  4. 男子汉大丈夫,宁死不屈!~VS~男子汉大丈夫,能屈能伸!

  5. 打狗还得看主人!~VS~杀鸡给猴看!

  6. 知无不言,言无不尽!~VS~交浅勿言深,沉默是金!

  7. 车到山前必有路!~VS~不撞南墙不回头!

  8. 条条大路通罗马!~VS~一条道走到黑!

  9. 礼轻情谊重!~VS~礼多人不怪!

  10. 人多力量大!~VS~人多嘴杂!

  11. 一个好汉三个帮!~VS~靠人不如靠己!

  12. 后生可畏!~VS~嘴上无毛、办事不牢!

  13. 人往高处走!~VS~爬得高,摔得重!

  14. 一口唾沫一个钉!~VS~人嘴两张皮,咋说咋有理!

  15. 大丈夫要光敏磊落!~VS~无毒不丈夫!

  16. 亡羊补牢,未为迟也!~VS~亡羊补牢,为时已晚!

  17. 瘦死的骆驼比马大!~VS~拔了毛的凤凰不如鸡!

  18. 宁可玉碎,不能瓦全!~VS~留得青山在,不怕没柴烧!

  19. 人不可貌相,海水不可斗量!~VS~人靠衣裳马靠鞍!

  20. 浪子回头金不换!~VS~狗改不了吃屎!

  21. 苦海无边,回头是岸!~VS~开弓没有回头箭!

  22. 退一步海阔天空!~VS~狭路相逢勇者胜!

  23. 三百六十行,行行出状元!~VS~万般皆下品,唯有读书高!

  24. 书到用时方恨少!~VS~百无一用是书生!

  25. 金钱不是万能的!~VS~有钱能使鬼推磨!

  26. 天无绝人之路!~VS~天网恢恢,疏而不漏!

  27. 出淤泥而不染!~VS~近朱者赤,近墨者黑!

  28. 捉贼捉赃,捉奸捉双!~VS~欲加之罪,何患无辞!

  29. 贫贱不能移!~VS~人贫志短,马瘦毛长!

  30. 青取之于蓝而胜于蓝!~VS~姜还是老的辣!

  31. 万般皆下品,唯有读书高!---《神童诗》~VS~百无一用是书生!---《杂感》

  32. 在天愿做比翼鸟,在地愿为连理枝!---《长恨歌》~VS~夫妻本是同林鸟,大难来时各自飞!---《警世恒言》

  33. 光阴似箭!~VS~度日如年!

  34. 金钱不是万能的!~VS~有钱能使鬼推磨!

  35. 小心驶得万年船!~VS~撑死胆大的,饿死胆小的!

  36. 得饶人处且饶人!~VS~有仇不报非君子!

  37. 明人不做暗事!~VS~兵不厌诈!

  38. 邪不压正!~VS~道高一尺,魔高一丈!

  39. 人定胜天!~VS~天意难违!

  40. 双喜临门!~VS~福无双进,祸不单行!

  41. 等待更新……

兴趣 - 其他
实用 收藏
1…678910…11
鲁ICP备2023049263号-1
© 2020 – 至今 闲暇时光
由 PHP MySQL 开发而成 | 主题 - Yun
upyun