client.id уникальный для каждого сервера ID сессии и в теории, при неправильной обработке disconnect, он может быть назначен совсем другому клиенту. В общем случае контролировать прямую связь soket.io client.id и ID клиента в базе - задача не из простых.
Намного проще хранить этот ID на клиенте (localStorage) и передавать его с каждым сообщением и поддерживать один актуальный маппинг MySQL ID <=> client.id в памяти сервера.
По поводу параллельно открытых вкладок проблема известная - браузеры по умолчанию могут держать 2-3 постоянно открытых коннекта (websocket) на один URL. Решается синхронизацией табов через localStorage:
html5demos.com/storage-events
Или
https://groups.google.com/forum/#!topic/socket_io/...,
или
stackoverflow.com/questions/18654567/save-socket-i...